Я написал эту функцию PowerShell для резервного копирования наших репозиториев Mercurial:
function BackupHg
{
param($repositoryRoot, $destination)
# The path to the Hg executable
$hg = """C:\Python26\hg.bat"""
# Get the list of repos
Get-ChildItem $repositoryRoot |
Where { $_.psIsContainer -eq $true } |
ForEach -Process {
$repo = $_.FullName
$folder = $_.Name
if (Test-Path "$repo\.hg") {
$cmdLine = "$hg clone -U $repo $destination\$folder"
cmd /c $cmdLine
}
else {
New-Item "$destination\$folder" -type directory
BackupHg "$repositoryRoot\$folder" "$destination\$folder"
}
}
}
Вы передаете в корневую папку и место назначения резервной копии, и он находит все папки, проверяет, является ли это репозиторием Mercurial (ищет.hg directory) и клонирует репозиторий в место назначения резервной копии.Если папка не является репозиторием Mercurial, то она сама выполняет рекурсию.
Это сделано так, потому что мы используем папки для организации наших репо, поэтому весь код для каждого клиента находится в отдельной папке, отдельной от других клиентов.
Последний пункт.Наличие суб-репозиториев Mercurial не означает, что вам нужно рекурсировать.Если у вас нет репозитория с рабочей копией, ваш суб-репо не будет храниться в репозитории и должен быть заархивирован любой системой, в которой он хранится.Если это та же система, что и в репозитории, то это будет еще один репозиторий в вашей папке репозиториев, и для него будет выполнено резервное копирование с помощью приведенного выше сценария.
Например, у нас есть репозиторий WebApp с суб-репозиторием WebControls дляклиент и структура файла выглядят следующим образом:
C:\Repositories\Hg\Client\WebApp
C:\Repositories\Hg\Client\WebControls
WebControls не хранится в папке WebApp, даже если он является его вспомогательным хранилищем.