การสร้างพื้นที่เก็บข้อมูล GitHub จาก PowerShell
ฉันทำงานกับ GitHub API ใน PowerShell ต่อไป วันนี้ฉันมีฟังก์ชันที่คุณสามารถใช้เพื่อสร้างที่เก็บ GitHub ใหม่ แน่นอนว่าคุณจะต้องมีบัญชี GitHub และข้อมูลสำคัญอีกชิ้นหนึ่ง แต่หลังจากนั้น การสร้างที่เก็บข้อมูลใหม่ก็ค่อนข้างง่าย วิธีนี้ช่วยให้คุณจัดสรรโปรเจ็กต์ใหม่โดยอัตโนมัติได้ง่ายขึ้น ซึ่งเป็นอย่างอื่นที่ฉันกำลังดำเนินการอยู่ แต่สำหรับตอนนี้ มาสร้าง repos กันดีกว่า!
ข้อมูลส่วนแรกที่คุณต้องการคือโทเค็นการเข้าถึงส่วนบุคคลของ GitHub หากคุณไม่มีบันทึกไว้ คุณจะต้องสร้างขึ้นใหม่ ไปที่การตั้งค่าโปรไฟล์ GitHub ของคุณแล้วคลิกลิงก์ "โทเค็นการเข้าถึงส่วนบุคคล" คุณอาจเห็นรายการโทเค็นที่มีอยู่ แต่คุณจะไม่สามารถดูมูลค่าที่แท้จริงได้ แต่คุณสามารถสร้างโทเค็นใหม่เพื่อใช้กับสคริปต์ PowerShell ของคุณได้อย่างง่ายดาย
คลิกลิงก์ “สร้างโทเค็นใหม่” และยืนยันรหัสผ่านของคุณ ป้อนคำอธิบายแล้วเลือกขอบเขต เนื่องจากคุณอาจใช้สิ่งนี้กับสคริปต์ PowerShell อื่นๆ ฉันจึงเลือกขอบเขต repo ส่วนสำคัญ และผู้ใช้ทั้งหมด คลิก “สร้างโทเค็น” และคัดลอกสตริง 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 ฉันได้ตั้งค่าเริ่มต้นของค่าหลังเป็นตัวแปรจากโปรไฟล์ของฉัน ซึ่งเป็นสาเหตุที่พารามิเตอร์ไม่ได้ทำเครื่องหมายเป็นบังคับ คุณยังสามารถระบุคำอธิบายของที่เก็บได้ด้วย
เมื่อคุณสร้างพื้นที่เก็บข้อมูลใหม่ โดยค่าเริ่มต้น พื้นที่เก็บข้อมูลจะเป็นแบบสาธารณะ แต่หากคุณมีบัญชีแบบชำระเงิน คุณสามารถเลือกให้เป็นแบบส่วนตัวได้ repos ทั้งหมดยังได้รับ wiki ปัญหา และตัวเลือกในการดาวน์โหลด แต่คุณสามารถสร้าง repo ได้โดยไม่ต้องมีสิ่งเหล่านี้ด้วยพารามิเตอร์ที่เกี่ยวข้อง
ฉันมักจะสร้าง repos หลังจากที่ฉันเริ่มโปรเจ็กต์ในเครื่องแล้ว ดังนั้นฉันจึงจัดการสิ่งต่าง ๆ เช่นใบอนุญาตและ README.md ด้วยตัวฉันเอง เมื่อคุณสร้าง repo ใหม่ด้วยฟังก์ชันของฉัน คุณสามารถเลือกรวมใบอนุญาตได้ (ฉันได้เพิ่มชุดการตรวจสอบสำหรับตัวเลือกทั่วไปที่ฉันคิดว่าคุณต้องการ) รวมถึงพารามิเตอร์ในการกำหนดค่าเริ่มต้นอัตโนมัติ สิ่งนี้จะสร้างไฟล์ 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
เนื้อความนี้กลายเป็นส่วนหนึ่งของพารามิเตอร์ที่ฉันจะกำหนดให้ Inrigg-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 แต่ Invivo-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
ตอนนี้เป็นของจริงแล้วฉันจะดรอป -Verbose
เสร็จแล้ว! คุณสามารถดูคำสั่ง git ที่ส่วนท้ายเป็นสีเขียว นี่คือ repo บน GitHub
มันยังไม่มีอะไรอยู่ในนั้น และฉันจะลบมันเร็วๆ นี้ แต่ก็ใช้งานได้
หวังว่าฟังก์ชันนี้จะกลายเป็นส่วนหนึ่งของชุดเครื่องมือที่ใหญ่กว่าในที่สุด แต่อย่าลังเลที่จะใช้ตอนนี้และแจ้งให้เราทราบว่ามันทำงานอย่างไรสำหรับคุณ
สนุกและมีวันหยุดสุดสัปดาห์ที่ดี