ตรวจสอบ Git ด้วย PowerShell
สัปดาห์ที่แล้วบน Twitter ฉันเห็นการสนทนาเกี่ยวกับปัญหาที่เกี่ยวข้องกับ git เรื่องราวสั้นๆ ก็คือบุคคลนั้นมีพื้นที่ดิสก์เหลือน้อยและไม่เข้าใจว่าทำไม ปรากฎว่าบุคคลนี้มีโครงการพัฒนาหลายโครงการโดยใช้ git การติดตามการเปลี่ยนแปลงและกิจกรรมอื่น ๆ ที่เกี่ยวข้องทั้งหมดจะถูกจัดเก็บไว้ในโฟลเดอร์ .git ที่ซ่อนอยู่ จำนวนข้อมูลในโฟลเดอร์นี้ล้นมือแล้ว นี่ไม่ใช่พฤติกรรมที่ไม่คาดคิดเสมอไป ที่จริงแล้ว คุณสามารถและควรเรียกใช้ git gc เป็นระยะๆ เพื่อดำเนินการดูแลทำความสะอาดขั้นพื้นฐาน ส่วนนั้นเป็นเรื่องง่าย ฉันมีโปรเจ็กต์ที่จัดการคอมไพล์จำนวนหนึ่ง สิ่งที่ฉันสนใจมากกว่าคือการพิจารณาว่าโฟลเดอร์ใหญ่แค่ไหน เนื่องจาก git ใช้โฟลเดอร์ที่ซ่อนอยู่ จึงค่อนข้างง่ายที่จะลืมมัน ฉันเขียนฟังก์ชัน PowerShell เพื่อที่ฉันจะไม่ทำ
พื้นฐาน
เมื่อสร้างฟังก์ชันใดๆ ฉันแนะนำให้เริ่มต้นด้วยคำสั่งหรือชุดคำสั่งที่คุณสามารถเรียกใช้ในเซสชันแบบโต้ตอบที่บรรลุสาระสำคัญของเป้าหมายที่คุณต้องการได้เสมอ ในกรณีนี้ มันค่อนข้างง่ายในการรับรายการไดเร็กทอรีของไฟล์และกำหนดขนาดรวม
Get-ChildItem -Path C:\scripts\PSScriptTools\.git -file -Recurse | Measure-Object -Property Length -sum
ตอนนี้ฉันรู้ว่านิพจน์ใช้งานได้แล้ว ฉันสามารถใช้เป็นพื้นฐานของฟังก์ชันได้ ฉันมีชื่อ cmdlet และพารามิเตอร์แบบเต็มอยู่แล้ว ดังนั้นจึงเป็นข้อดี ทีนี้ลองคิดดูว่าฉันตั้งใจจะใช้สิ่งนี้อย่างไร
ฉันรู้ว่าโฟลเดอร์นี้จะเรียกว่า .git เสมอ ฉันมักจะส่งผ่านเส้นทางไดเรกทอรีหลัก และหากมี .git อยู่ ให้ทำการคำนวณ ซึ่งหมายความว่าฉันสามารถกำหนดพารามิเตอร์ Path และกำหนดค่าให้ยอมรับอินพุตไปป์ไลน์ได้
[Parameter(Position = 0, ValueFromPipeline, ValueFromPipelinebyPropertyName)]
[alias("pspath")]
[ValidateScript( {Test-Path $_})]
[string]$Path = "."
โปรดสังเกตว่าฉันได้สร้างนามแฝงด้วย pspath เนื่องจากพื้นที่เก็บข้อมูลส่วนใหญ่ของฉันอยู่ภายใต้ C:\Scripts และฉันต้องการที่จะเรียกใช้ dir c:\scripts -directory และไปป์ไปยังฟังก์ชันของฉัน จากประสบการณ์ฉันพบว่าถ้าฉันกำหนดนามแฝง pspath มันจะทำงานได้ง่ายขึ้นมาก
ด้วยเส้นทางที่อยู่ในมือ ฉันสามารถสร้างเส้นทางที่จะทดสอบได้
$full = Convert-Path -Path $Path
$git = Join-Path -Path $full -childpath ".git"
ฉันกำลังแปลงเส้นทางเพื่อให้ได้เส้นทางระบบไฟล์แบบเต็ม ฉันตั้งค่าเริ่มต้นสำหรับ $path เป็น '.' และฉันต้องการแปลงค่านั้นเป็นชื่อระบบไฟล์แบบเต็ม โปรดสังเกตการใช้ Join-Path ด้วย ไม่มีเหตุผลที่จะใช้การต่อข้อมูลเพื่อสร้างเส้นทาง มันง่ายที่จะเลอะเทอะ และโดยส่วนตัวแล้วฉันมองว่ามันเป็นสัญญาณของมือใหม่
ฉันขอชี้ให้เห็นว่าวัตถุประสงค์ที่แท้จริงของบทความนี้คือวิธีที่ฉันสร้างฟังก์ชันนี้และเทคนิคที่ฉันใช้ ผลลัพธ์ที่ได้จะมีประโยชน์ แต่ไม่ใช่เป้าหมายของฉันสำหรับโพสต์นี้ มีเครื่องมือที่เกี่ยวข้องกับ git และ PowerShell มากมาย
ฟังก์ชันเอาท์พุต
เมื่อคุณสร้างฟังก์ชัน PowerShell ฟังก์ชันนี้ควรทำสิ่งเดียวเท่านั้นและเขียนออบเจ็กต์ประเภทเดียวลงในไปป์ไลน์เท่านั้น ด้วยฟังก์ชันนี้ ฉันจึงตัดสินใจสร้างวัตถุที่เรียบง่าย
[PSCustomObject]@{
Path = $full
Files = $stat.count
Size = $Size
} #customobject
ฉันคาดหวังที่จะเรียกใช้สิ่งนี้ในเครื่องเท่านั้น ดังนั้นฉันจึงไม่คิดว่าฉันต้องการคุณสมบัติ Computername ฉันคิดว่าฉันสามารถเพิ่มคุณสมบัติ DateTime ได้ นั่นอาจมีประโยชน์ถ้าฉันกำลังเข้าสู่ระบบ ฉันสามารถดึงข้อมูลจากคอมไพล์เหมือนสาขาได้ แต่นั่นเริ่มเปลี่ยนไปสู่ข้อกำหนดชุดอื่น สิ่งที่ฉันต้องการจากฟังก์ชันนี้คือการบ่งชี้ว่าโฟลเดอร์ใหญ่แค่ไหน เพื่อที่ฉันจะได้รู้ว่าจำเป็นต้องเรียกใช้ git gc หรือไม่
วางแผนล่วงหน้า
อย่างที่กล่าวไปแล้ว ฉันได้เพิ่มฟีเจอร์เพิ่มเติมหนึ่งอย่างให้กับฟังก์ชันของฉัน Measure-Object ให้ค่าเป็นไบต์ ฉันไม่ค่อยเก่งในการบอกอย่างรวดเร็วว่ามีอะไรขนาด 100KB หรือ 100MB โดยปกติแล้ว ฉันจะบอกคนอื่นว่าอย่ารวมการจัดรูปแบบหรือการจัดการข้อมูลใดๆ ไว้ในฟังก์ชันของคุณ ฉันสามารถไพพ์เอาต์พุตของฉันไปที่ Select-Object ได้อย่างง่ายดายและสร้างคุณสมบัติแบบกำหนดเองโดยหารผลรวมด้วย 1KB หรือ 1MB อย่างไรก็ตาม ฉันคอยบอกผู้สร้างเครื่องมือ PowerShell อยู่ตลอดเวลาว่าคุณต้องคิดว่าใครจะใช้เครื่องมือของคุณ และอย่างไร ในกรณีนี้คือฉันเองและฉันรู้ว่ามักจะต้องการดูค่าในรูปแบบอื่นที่ไม่ใช่ไบต์ ดังนั้นฉันจึงเพิ่มพารามิเตอร์ $As
[ValidateSet("kb", "mb", "gb")]
[string]$As
โปรดทราบว่าฉันกำลังใช้เทคนิคการตรวจสอบพารามิเตอร์ ฉันกำลังจำกัดตัวเลือกพารามิเตอร์ไว้ที่ 3 ตัวเลือกนี้ ยิ่งไปกว่านั้น เนื่องจากฉันใช้ ValidateSet PowerShell จะใช้ค่าเหล่านี้พร้อมกับการเติมแท็บ!
ฟังก์ชั่น
ในตอนนี้ฟังก์ชั่นทั้งหมดนั้นอยู่บน Github
https://gist.github.com/jdhitsolutions/cbdc7118f24ba551a0bb325664415649
ฉันมีแผนอื่นสำหรับงานนี้ แต่สำหรับตอนนี้ฉันสามารถใช้มันเพื่อตรวจสอบโฟลเดอร์เดียวได้
หรือฉันสามารถตรวจสอบไดเร็กทอรีทั้งหมดได้
dir c:\scripts -directory | get-gitsize | Out-GridView -Title "Git Report"
ด้วยความพยายามพิเศษเพียงเล็กน้อย ฉันสามารถสร้างสคริปต์ควบคุมง่ายๆ ได้
dir c:\scripts -Directory | Get-GitSize | where-object {$_.size -ge 25MB} |
Out-GridView -Title "Select repos to compress" -PassThru | foreach-object {
set-location $_.Path
git gc --aggressive
}
คุณอาจมีแนวคิดอื่นๆ ในใจเกี่ยวกับวิธีใช้สิ่งนี้ ถ้าเป็นเช่นนั้นฉันหวังว่าคุณจะแบ่งปัน สนุก.