Клонировать репозитории git и включить владельца в структуру папок - PullRequest
0 голосов
/ 24 декабря 2018

Я ищу способ клонировать репозиторий git, например, из GitHub, и включить владельца или организацию в структуру папок загрузки.

Например, при клонировании репозитория angular-cli изорганизация angular в текущей папке, я хотел бы, чтобы она клонировала ее в моем текущем рабочем каталоге следующим образом: angular/angular-cli.

Я попытался найти решение, но не смог его найти,потому что в основном все результаты, где просто говорят мне, как клонировать хранилище.Конечно, я могу это сделать, но мне бы хотелось иметь инструмент, который поможет мне автоматизировать этот процесс.Может быть, сценарий bash или powershell, или даже что-то встроенное в git напрямую.

Редактировать: В отличие от другого вопроса, я ищу инструмент, который автоматически помещает хранилище в правильную структуру папок, основанную наисточник, например Github, и пользователь / организация, например Angular.

1 Ответ

0 голосов
/ 26 декабря 2018

Я сам создал решение в powershell.Вы можете настроить разных провайдеров Git по имени и регулярному выражению, которое используется для разбора URL и построения соответствующего пути для хранилища.

<#
    .DESCRIPTION
    Clone git repositories including the project/user/organization/... folder structure
#>
Param(
    [parameter(Mandatory = $true)]
    [String]
    $Url
)

#------------------------------------------------------------------------------
# Configuration of available providers
#------------------------------------------------------------------------------
$GitProviders = @{
    "Azure"  = {
        if ($args[0] -Match "https://(?:\w+@)?dev.azure.com/(?<Organization>\w+)/(?<Project>\w+)/_git/(?<Repository>[\w-_]+)") {
            return [io.path]::Combine($Matches.Organization, $Matches.Project, $Matches.Repository)
        }
    }

    "GitHub" = {
        if ($args[0] -Match "https://github\.com/(?<UserOrOrganization>\w+)/(?<Repository>[\w-_]+)\.git") {
            return [io.path]::Combine($Matches.UserOrOrganization, $Matches.Repository)
        }
    }
}


#------------------------------------------------------------------------------
# Find the right provider and clone the repository
#------------------------------------------------------------------------------
$Match = $GitProviders.GetEnumerator() |
    Select-Object @{n = "Provider"; e = {$_.Key}}, @{n = "Path"; e = {$_.Value.invoke($Url)}} |
    Where-Object { $_.Path -ne $null } |
    Select-Object -First 1

if ($Match) {
    Write-Host "Found match for provider: $($Match.Provider)"

    if ($Global:ProjectsDir) {
        $TargetDirectory = [io.path]::Combine($Global:ProjectsDir, $Match.Provider, $Match.Path)
    }
    else {
        Write-Error "No projects directory configured. Aborting."
    }

    git clone $Url $TargetDirectory
}
else {
    Write-Error "No match found for repository url: $Url"
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...