iNNOKENTIY21
Silver Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Код: function Clone-GitHubRepo { <# .SYNOPSIS Клонирование github репозитория .DESCRIPTION Функция для клонирования github репозитория в локальный репозиторий Git .PARAMETER Path System.String - Путь к локальному репозиторию Git .PARAMETER URL System.String - Адресс github репозитория Например: https://github.com/author/reponame .INPUTS System.String - Путь к локальному репозиторию Git .INPUTS System.String - Ссылка на github репозиторий .NOTES Автор: iNNOKENTIY21 Зависимость: Требуется Git for windows .LINK https://gitforwindows.org/ #> [CmdletBinding()] param ( # Путь к локальному репозиторию Git [Parameter(Mandatory = $true)] [string] $Path, # Ссылка на github репозиторий [Parameter(Mandatory = $true)] [string] $URL ) # Проверка пути к локальному репозиторию Git if (!(Test-Path -Path $Path -PathType Container)) { $host.UI.WriteErrorLine("Не удается найти путь $Path") Exit 1 } # Создается URI для работы с сылкой $uri = try { [Uri]::new($URL) } catch { $host.UI.WriteErrorLine($Error[0].Exception.Message) } # Проверка был ли создан URI if (!$uri) { $host.UI.WriteErrorLine("Не удалось получить URI из $URL") Exit 2 } # Проверка URI на валидную ссылку репозитория github if (($uri.Host -ne "github.com") -and ($uri.Segments.Count -ne 3)) { $host.UI.WriteErrorLine( "$($uri.AbsoluteUri) не является ссылкой на github.com репозиторий" ) Exit 3 } # Автор репозитория (2 сегмент в ссылке на github репозиторий) $author = $uri.Segments[1] # Название репозитория (3 сегмент в ссылке на github репозиторий) $repoName = $uri.Segments[2] # Генерация пути (локальный Git репозиторй + автор репозитория) $authorPath = Join-Path -Path $Path -ChildPath $author # Проверка существует ли папка автора репозитрия в локальном Git репозитории # если нет, создать такую папку if (!(Test-Path -Path $authorPath -PathType Container)) { try { $null = New-Item $authorPath -ItemType Directory -ErrorAction Stop } catch { $host.UI.WriteErrorLine($Error[0].Exception.Message) } } # Генерация пути для локального репозитонрия # (папка автора в локальном Git репозитории + имя репозитория) $repoPath = Join-Path -Path $authorPath -ChildPath $repoName # Проверка пути локального репозитонрия if (Test-Path -Path $repoPath -PathType Container) { $host.UI.WriteErrorLine("Путь $repoPath уже существует") Set-Location -Path $repoPath Exit 4 } # Переход в папку автора Set-Location -Path $authorPath # Запуск программы Git для клолнирования Git clone --recursive $uri.AbsoluteUri # Переход в папку репозитория Set-Location -Path $repoPath } # Запуск функции с параметрами: # (локальный Git репозиторий) (ссылка на github репозиторий из буфера обмена) Clone-GitHubRepo "c:\sources\github\" (Get-Clipboard) |
|