Как найти все «рабочие копии SVN» на Win XP - PullRequest
2 голосов
/ 28 марта 2012

У меня Windows XP.Я бы хотел обновить TortoiseSVN до версии 1.7 .Для этого мне нужно убедиться, что я могу найти все рабочие копии SVN на моем ПК.Таким образом, они могут быть обновлены.

Я нашел аналогичный вопрос , но он специфичен для Powershell.Итак, мне было интересно, есть ли более общее решение для поиска всех «рабочих копий SVN» на Win XP.

Если бы я знал эквивалент 'linux find' на windows, я мог бы написать это сам.Но я надеюсь, что там уже может быть сценарий bash (или, возможно, какое-то решение, которое еще проще), которое я и другие могли бы использовать.

  • сканирует компьютер
  • , еслион находит каталог, содержащий каталог с именем ".svn"
    • , повторяющий это имя, и
    • больше не ищет этот каталог

Ответы [ 4 ]

2 голосов
/ 28 марта 2012

Как только у вас есть powershell, я могу предоставить свой полный скрипт для обновления рабочих копий до 1.7

$prev = "^$"
$workingCopies = Get-ChildItem -Recurse -Force -Include ".svn" -Path "d:\Projects\" |?{$_.PSIsContainer -and $_.Fullname.StartsWith($prev)-eq $false} |%{$prev=$_.Fullname.TrimEnd(".svn"); $prev}

foreach($copy in $workingCopies)
{
    &"C:\Program Files\TortoiseSVN\bin\svn.exe" upgrade $copy;
}

У меня не было проблем с правами доступа к директории "System Volume" (это было просто случайно, потому что я храню все свои источники в одной папке, на которую у меня есть полные права ..). Что касается вашей проблемы с политикой выполнения - вот хороший трюк, чтобы избежать его установки и возврата. Вы можете запустить powershell со специальными параметрами, чтобы избежать проблем с политикой выполнения, настройками профиля пользователя (которые могут быть нарушены по разным причинам) и т. Д .:

%SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe -NonInteractive -NoProfile -ExecutionPolicy Unrestricted -File “C:\Projects\ConvertSvnToVersion17.ps1”

Также я мог бы уточнить, что именно делает этот скрипт (если вам интересно):

$prev = "^$"

Инициализировать $ prev для регулярного выражения, совпадающего с пустым - ^ $ никогда не соответствует значению (кроме startline-endline). Это было необходимо для прохождения начальной проверки

Get-ChildItem -Recurse -Force -Include ".svn" -Path "d:\Projects\" 

Получить все объекты с именем ".svn" (в нашем случае - все файлы и папки с точным именем ".svn"), запущенные из Path, рекурсивно. И направить его к следующей конструкции:

?{$_.PSIsContainer -and $_.Fullname.StartsWith($prev)-eq $false} 

? {... Statement ...} является ярлыком для командлета «Where-Object», $ _ - это способ адресации «каждой» записи из канала. Это может быть переписано как

foreach($entry in $entriesFromSomewhere)
{
    If($entry.PSIsContainer -eq $true -and $entry.Fullname.StartsWith($prev) -eq $false)
    {
        "If entry is directory" and  "fullname not start with value from $prev"
        ...Pass entry to next construct...
    }
}

Но я написал это как однострочник для краткости

%{$prev=$_.Fullname.TrimEnd(".svn"); $prev}

% {} - это сокращение для Foreach =) И эта конструкция делает 2 вещи:

  1. Назначить полное имя папки без хвоста ".svn" для $ prev
  2. Передайте $ prev дальше до следующего конвейера.

И весь набор результатов, присвоенный $ workingCopies как массив (любой результат с более чем 1 элементом будет массивом)

foreach($copy in $workingCopies)
{
    &"C:\Program Files\TortoiseSVN\bin\svn.exe" upgrade $copy;
}

Элемент Foreach в массиве - выполнить команду (& подписать «выполнить как команду») «… \ svn.exe upgrade»

Вся магия здесь заключается в обратном отслеживании элемента $ prev: В первой записи «.svn» $ prev содержит несоответствующее значение, поэтому сначала отметьте «где» будет уменьшено до «Если запись является каталогом». Затем назначив шаг, поместим папку parent dir. Ex. Если найдено полное имя dir c: \ projects \ project1.root \ trunk.svn - $ prev будет присвоено "c: \ projects \ project1.root \ trunk \" . Этот трюк поможет нам отфильтровать все низкоуровневые каталоги .svn: c: \ projects \ project1.root \ trunk \ SubProject1.svn entry - не пройдет проверку "не начинается с $ prev" И таким образом мы будем фильтровать только первый уровень .svn dirs, потому что все вложенные .snv будут отфильтрованы по StartsWith ($ prev) -eq $ false

Так что это довольно просто, но выглядит как волшебство =)

Кстати, спасибо за ваш ответ здесь - ваши усилия очень вдохновили меня на написание этого комментария и прояснение всего сценария.

Гики грамматики должны быть вызваны на этот комментарий для очистки и перефразирования моего "так называемого английского";)

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

Для сложных и мощных поисков в Windows-боксе я могу порекомендовать (я использую его в реальной жизни)

  • Встроенный поиск в Total Commander (у вас достаточно времени для оценки)
  • GrepWin (с подстановочными знаками и регулярными выражениями для шаблонов имен файлов)

Вы упускаете суть.SVN-клиенты 1.7 могут (и действительно должны) обновлять существующие рабочие копии после установки перед использованием.Также nore: все каталоги внутри WC для версий до 1.6 имеют .svn каталоги, вас интересуют только каждый самый верхний

и позже это может быть полезнодля вас

1.6 svn-dir

.svn>dir /B
all-wcprops
entries
prop-base
props
text-base
tmp

1.7 svn-dir

.svn>dir /B
entries
format
pristine
tmp
wc.db
1 голос
/ 28 марта 2012

Мне удалось найти все «рабочие копии SVN» в Win XP.

Я сделал это, используя скрипт PowerSell , предоставленный Алексеем Щербаком.

Вот краткое описание процесса с использованием метода PowerShell .

Проверьте, установлен ли PowerShell.

Windows PowerShell - это оболочка командной строки и среда сценариев, которая предоставляет возможности .NET Framework пользователям командной строки и разработчикам сценариев.

Проверьте, не установлено ли оно, попытавшись запустить его.

Чтобы запустить Windows PowerShell из поля «Выполнить», нажмите Пуск , нажмите Выполнить и введите:

powershell

Если это не сработает ...

Установите его

  • Скачать Microsoft Windows PowerShell 1.0 для Windows XP с Cnet.com
  • (PowerShell 2 для Windows XP также доступен, но я его не использовал. ( инструкции здесь ))

После установки ...

Запустите PowerShell и играйте

Пуск > Все программы > Windows PowerShell 1.0 > Windows PowerShell

См. Краткое введение в PowerShell на YouTube .

Создание сценария PowerShell

Скопируйте скрипт Алексея Щербака PowerSell * (который находит рабочие копии svn) в текстовый файл и сохраните его как-то вроде C:\PowerShellScripts\FindSvnWorkingDirectories.ps1.

Я немного изменил его, чтобы выполнить поиск на диске C и подавить доступ запрещен ошибки:

$prev = "^$"

Get-ChildItem -ErrorAction SilentlyContinue -Recurse -Force -Include ".svn" -Path "c:\" `
| ?{$_.PSIsContainer -and $_.Fullname.StartsWith($prev)-eq $false}`
| %{ $prev=$_.Fullname.TrimEnd(".svn"); $prev}

Чтобы подробно объяснить, что делает этот скрипт:

$prev = "^$" инициализирует $prev регулярным выражением с пустым соответствием; ^$ никогда не будет соответствовать никакому значимому значению (кроме startline-endline). Это было необходимо для прохождения начальной проверки.

Get-ChildItem -ErrorAction SilentlyContinue -Recurse -Force -Include ".svn" -Path "c:\" `

Получает все объекты с именем ".svn" (в нашем случае - все файлы и папки с точным именем ".svn"), запущенные из Path, рекурсивно.

  • Get-ChildItem по умолчанию является псевдонимом команды dir.
  • -ErrorAction SilentlyContinue - предотвращает отображение ошибок, таких как Доступ к пути «C: \ System Volume Information» запрещен , как описано здесь .
  • -Recurse означает поиск рекурсивно.
  • -Force обеспечивает поиск скрытых файлов.
  • -Include ".svn" определяет имя файла, которое мы ищем.
  • -Path "c:\" указывает путь к поиску.
  • `Знак обратной черты означает продолжить оператор до следующей строки .

На следующей строке:

| ?{$_.PSIsContainer -and $_.Fullname.StartsWith($prev)-eq $false}`

Символ трубы, |, передает вывод Get-ChildItem в следующие командлеты.

?{...statements... } - сокращение для командлета Where-Object.

$_ is способ адресации "каждой" записи из трубы. Он в основном говорит «Если запись является каталогом» и «полное имя не начинается со значения из $ prev», то «Передать запись в следующую конструкцию».

| %{ $prev=$_.Fullname.TrimEnd(".svn"); $prev}

Запись затем передается следующему оператору.

%{} - сокращение от Foreach-Object. Эта конструкция делает 2 вещи:

  • Назначьте полное имя текущей папки $prev (без хвоста ".svn").
  • Пропустить $prev до следующего трубопровода.

Разрешить PowerShell запускать скрипт

По умолчанию в целях безопасности PowerShell ExecutionPolicy не позволяет запускать сценарии PowerShell. Итак, вам нужно разрешить это сделать.

Подробнее см. Запуск сценариев Windows PowerShell .

Я сделал следующее:

Примечание. Символ хеша (#) - это просто снимок для командной строки.

Определить текущий ExecutionPolicy:

# Get-ExecutionPolicy
Restricted

Если, как и у меня, его ограничен . Измените политику, чтобы разрешить запуск сценария:

# Set-ExecutionPolicy RemoteSigned

Запустить сценарий PowerShell

Затем запустите скрипт, чтобы найти рабочие копии SVN. Обратите внимание, что вам необходимо указать полный путь к сценарию PowerShell.

# C:\PowerShellScripts\FindSvnWorkingDirectories.ps1

Если на ПК имеется множество каталогов, это может занять некоторое время. Результаты должны появиться.

Копирование и вставка результаты куда-то

Я сделал это, выбрав выходной текст с помощью мыши. Затем скопируйте его:

Щелкните значок PowerShell (в верхнем левом углу окна)>> 1181 * Редактировать > Копировать

Затем я вставил его в текстовый редактор.

Вернуть политику исключений PowerShell в исходное состояние

Поскольку я редко использую PowerShell и ослабил политику исключений только для запуска этого одноразового сценария, я собираюсь вернуть его обратно в исходное состояние для безопасности.

Определить текущий ExecutionPolicy:

# Get-ExecutionPolicy
RemoteSigned

Измените политику, чтобы вернуть ее в исходное состояние:

# Set-ExecutionPolicy Restricted

Так вот как я это сделал.

0 голосов
/ 28 марта 2012

Чтобы найти все файлы .svn, вы можете использовать dir.dir .svn /s сделает это (хотя это не сломается при сканировании подкаталогов) или вы можете использовать Windows Explorer и попросить маленькую собачку найти все файлы .svn.

или вы можете загрузить unxutils и использовать найти в конце концов!

...