当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 从 PowerShell 创建 GitHub 存储库

作者:精品下载站 日期:2024-12-14 07:50:37 浏览:12 分类:玩电脑

从 PowerShell 创建 GitHub 存储库


我一直在继续在 PowerShell 中使用 GitHub API。今天我有一个函数可以用来创建新的 GitHub 存储库。当然,您需要有一个 GitHub 帐户和另一条关键信息,但之后创建新的存储库就很容易了。这使您可以更轻松地自动配置新项目,这是我正在做的其他事情。但现在,让我们创建一些存储库!

您需要的第一个信息是 GitHub 个人访问令牌。如果您没有保存一个,则需要创建一个。转到您的 GitHub 配置文件设置,然后单击“个人访问令牌”链接。您可能会看到现有代币的列表,但无法看到实际价值。但您可以轻松创建新令牌以与 PowerShell 脚本一起使用。

单击“生成新令牌”链接并确认您的密码。输入描述,然后选择范围。因为您可能会将其与其他 PowerShell 脚本一起使用,所以我会选择所有存储库、要点和用户范围。单击“生成令牌”并复制 40 位数字字符串并将其保存在安全的地方。这是您需要进行身份验证的 Git 令牌。在我的 PowerShell 配置文件中,我将其存储在变量 $gitToken 中。您应该保护这个令牌。

现在您已准备好开始使用您的 GitHub 帐户。

这是我一直在研究的 PowerShell 函数。

Function New-GitHubRepository {
[cmdletbinding(SupportsShouldProcess)]

Param(
[Parameter(Position = 0, Mandatory, HelpMessage = "Enter the new repository name")]
[ValidateNotNullorEmpty()]
[string]$Name,

[string]$Description,

[switch]$Private,
[switch]$NoWiki,
[switch]$NoIssues,
[switch]$NoDownloads,
[switch]$AutoInitialize,

#license templates found at https://github.com/github/choosealicense.com/tree/gh-pages/_licenses
[ValidateSet("MIT","apache-2.0","gpl-3.0","ms-pl","unlicense")]
[string]$LicenseTemplate,

[Alias("token")]
[ValidateNotNullorEmpty()]
[string]$UserToken = $gitToken,

#write full native response to the pipeline
[switch]$Raw
)

Write-Verbose "[BEGIN  ] Starting: $($MyInvocation.Mycommand)"
#display PSBoundparameters formatted nicely for Verbose output  
[string]$pb = ($PSBoundParameters | Format-Table -AutoSize | Out-String).TrimEnd()
Write-Verbose "[BEGIN  ] PSBoundparameters: `n$($pb.split("`n").Foreach({"$("`t"*2)$_"}) | Out-String) `n" 

#create the header
$head = @{
Authorization = 'Basic ' + $UserToken
}

#create a hashtable from properties
$hash = @{
 name = $Name
 description = $Description
 private = $Private -as [boolean]
 has_wiki = (-Not $NoWiki)
 has_issues = (-Not $NoIssues)
 has_downloads = (-Not $NoDownloads)
 auto_init = $AutoInitialize -as [boolean]
}

if ($LicenseTemplate) {
    $hash.add("license_template",$LicenseTemplate)
}

$body = $hash | ConvertTo-Json

Write-Verbose "[PROCESS] Sending json"
Write-Verbose $body

#define parameter hashtable for Invoke-RestMethod
$paramHash = @{
Uri = "https://api.github.com/user/repos" 
Method = "Post"
body = $body 
ContentType = "application/json"
Headers = $head
UseBasicParsing = $True
DisableKeepAlive = $True
}

#should process
if ($PSCmdlet.ShouldProcess("$name [$description]")) {
   $r = Invoke-RestMethod @paramHash

    if ($r.id -AND $Raw) {
        Write-Verbose "[PROCESS] Raw result"
        $r

    } elseif ($r.id) {
        write-Verbose "[PROCESS] Formatted results"

        $r | Select-Object @{Name = "Name";Expression = {$_.name}},
        @{Name = "Description";Expression = {$_.description}},
        @{Name = "Private";Expression = {$_.private}},
        @{Name = "Issues";Expression = {$_.has_issues}},
        @{Name = "Wiki";Expression = {$_.has_wiki}},
        @{Name = "URL";Expression = {$_.html_url}},
        @{Name = "Clone";Expression = {$_.clone_url}}
    } else {
        
        Write-Warning "Something went wrong with this process"
    }

    if ($r.clone_url) {
      $msg = @"

To push an existing local repository to Github run these commands:
-> git remote add origin $($r.clone_url)"
-> git push -u origin master

"@
    Write-Host $msg -ForegroundColor Green

    }
}

Write-Verbose "[END    ] Ending: $($MyInvocation.Mycommand)"

}

让我指出几点。

唯一真正需要的参数是名称和 GitHub 令牌。我已将后者的默认值设置为我的配置文件中的变量,这就是该参数未标记为强制的原因。您还可以指定存储库描述。

当您创建新存储库时,默认情况下它是公共的。但如果您有付费帐户,则可以选择将其设为私人帐户。所有存储库还都有一个 wiki、问题和下载选项,但您可以使用相应的参数创建一个没有任何这些内容的存储库。

我倾向于在本地启动项目后创建存储库,因此我自己处理许可证和 README.md 等事务。当您使用我的函数创建新的存储库时,您可以选择包含许可证(我已经为我认为您会做出的更常见的选择添加了验证集)以及自动初始化的参数。这将创建一个默认的 README.md 文件。

所有这一切的神奇之处在于创建一个格式为 json 的指令体。

#create a hashtable from properties
$hash = @{
 name = $Name
 description = $Description
 private = $Private -as [boolean]
 has_wiki = (-Not $NoWiki)
 has_issues = (-Not $NoIssues)
 has_downloads = (-Not $NoDownloads)
 auto_init = $AutoInitialize -as [boolean]
}

if ($LicenseTemplate) {
    $hash.add("license_template",$LicenseTemplate)
}

$body = $hash | ConvertTo-Json

这个主体成为我将传递给 Invoke-Restmethod 的参数的一部分。

$paramHash = @{
Uri = "https://api.github.com/user/repos" 
Method = "Post"
body = $body 
ContentType = "application/json"
Headers = $head
UseBasicParsing = $True
DisableKeepAlive = $True
}

标头是根据您的用户令牌构造的。

$head = @{
Authorization = 'Basic ' + $UserToken
}

GitHub 的结果是一个 json 文档,但 Invoke-RestMethod 会自动将其转换为对象。默认情况下,我根据此数据构建自定义输出对象。

$r | Select-Object @{Name = "Name";Expression = {$_.name}},
        @{Name = "Description";Expression = {$_.description}},
        @{Name = "Private";Expression = {$_.private}},
        @{Name = "Issues";Expression = {$_.has_issues}},
        @{Name = "Wiki";Expression = {$_.has_wiki}},
        @{Name = "URL";Expression = {$_.html_url}},
        @{Name = "Clone";Expression = {$_.clone_url}}

或者您可以使用 -Raw 查看所有内容。

该功能的最后一点是您在创建空存储库时在 GitHub 中获得的内容,这是有关如何配置本地存储库的提示。

if ($r.clone_url) {
      $msg = @"

To push an existing local repository to Github run these commands:
-> git remote add origin $($r.clone_url)"
-> git push -u origin master

"@
    Write-Host $msg -ForegroundColor Green

    }

我似乎永远记不住语法,所以这对我来说是一个很好的接触。

我的函数使用 Write-Verbose 并支持 -Whatif。

[玩转系统] 从 PowerShell 创建 GitHub 存储库

现在说真的,我会放弃-Verbose。

[玩转系统] 从 PowerShell 创建 GitHub 存储库

完毕!您可以在末尾看到绿色的 git 命令。这是 GitHub 上的存储库。

[玩转系统] 从 PowerShell 创建 GitHub 存储库

它里面什么也没有,我很快就会删除它,但它有效。

希望这个函数最终会成为一个更大的工具包的一部分。但现在请随意使用它,并让我知道它如何为您服务。

享受并度过一个愉快的周末。

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯