Как я могу сказать, что все каталоги в рабочей копии SVN указывают на один и тот же корень хранилища? - PullRequest
2 голосов
/ 14 июня 2011

Недавно у нас возникла проблема, когда TortoiseSVN или AnkhSVN (я не могу определить, какой) разбился во время переключения рабочей копии SVN. Наш разработчик не осознавал, что коммутатор был неполным, и все было в порядке, пока не пришло время объединить ветку с транком, где мы узнали, что некоторые изменения уже были перенесены в транк, а некоторые изменения были зафиксированы. в филиал.

К счастью, это на самом деле ни на что не повлияло, но я обеспокоен тем, что это может повториться в будущем, и мне нужен быстрый способ проверить, на какой репозиторий указывают подкаталоги в рабочей копии. Теперь в Linux я мог бы очень быстро взломать сценарий оболочки, чтобы определить это, но в настоящее время я не знаю, как мне это выяснить в Windows.

Я не совсем против того, чтобы что-то взламывать вместе с помощью SharpSVN, если мне нужно (и будьте уверены, я поделюсь этим, если я это сделаю), но я хотел бы знать, могу ли я сэкономить некоторое время, получив некоторые встроенные TortoiseSVN или AnkhSVN есть возможность сделать это для меня.

Ответы [ 3 ]

3 голосов
/ 14 июня 2011

Если вы можете использовать Powershell, используйте что-то вроде ниже:

gci -Recurse | ?{ $_.psIsContainer -eq $true} | %{svn info $_.fullname} | select-string -Pattern "PATH:|URL:"

Для каждой папки в вашей рабочей копии будет отображаться путь и URL-адрес вашего репозитория. Если какая-то папка переключена на ветку, вы можете увидеть этот URL и путь.

Вы можете легко настроить его для печати только пути и URL-адресов, которые находятся за пределами вашей текущей ветви (или ствола)

Игнорировать неверсионные папки легко:

(svn status $_.fullname) -notmatch "\?")

Так что все это будет:

gci | ?{ $_.psIsContainer -eq $true -and ((svn status $_.fullname) -notmatch "\?")} | %{svn info $_.fullname} | select-string -Pattern "PATH:|URL:"

Вам необходимо иметь svn-клиент из командной строки, такой как SlikSVN или CollabnetSVN и по пути.

1 голос
/ 23 ноября 2011

@ manojlds ответ вполне разумный, но мои тесты быстро выявили некоторые проблемы.Во-первых, хотя он правильно отфильтровывает не-SVN-папки, которые являются непосредственными дочерними элементами, он не обрабатывает внуков.Команда svn status блокирует такие элементы с сообщением "не рабочая копия" .Помните, что Get-ChildItem не прекращает погружаться из папки только потому, что папка не является папкой Subversion;он отмечает этот факт, но продолжает копать, поэтому вы должны также обращаться с потомками.

Затем команда svn info блокирует игнорируемые элементы (т. Е. Свойство svn:ignore папки) с жалобой «не версионный ресурс» .

Наконец, он может отфильтровать слишком много : он полагается на svn status вывод строки, начинающейся со знака вопроса (указывающего неверсированный), если и только если указанная папка имеет значение вфакт неуправляемый.Однако, поскольку svn status в папке включает в себя всех ее потомков, если любой элемент-потомок (файл или папка) версионной папки не версионен, svn status включает статус неверсионногоиндикатор - знак вопроса - вызывающий ошибочно пропущенную версионную папку по условному условию.Верхняя панель на рисунке показывает, что без неверсированного потомка оба дочерних элемента корня сообщают о нормальном состоянии.После добавления папки «Ресурсы» в качестве неверсированного потомка (нижняя панель) отчет из svn status теперь включает неверсированный дочерний элемент.

svn status includes all descendants

Лучшее решение доступно с использованием 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) { $_ }
}
1 голос
/ 14 июня 2011

Если вы можете создать скрипт в Linux, вы можете установить Cygwin на клиент, чтобы иметь доступ к сценариям bash. Или, возможно, Perl, так как они имеют свои собственные установки Windows. UnxUtils также довольно хорош http://unxutils.sourceforge.net/.

...