Git'i PowerShell ile Kontrol Altında Tutmak
Geçen hafta Twitter'da git ile ilgili bir sorun hakkında bir tartışma gördüm. Hikayenin kısa versiyonu, kişinin disk alanının tükenmesi ve nedenini anlamamasıdır. Bu kişinin git kullanarak birkaç geliştirme projesi olduğu ortaya çıktı. Tüm değişiklik izleme ve ilgili diğer etkinlikler gizli bir .git klasöründe saklanır. Bu klasördeki veri miktarı kontrolden çıkmıştı. Bu mutlaka beklenmeyen bir davranış değildir. Aslında, temel temizlik işlemlerini gerçekleştirmek için git gc'yi düzenli aralıklarla çalıştırabilirsiniz ve çalıştırmalısınız. O kısım kolaydır. Git tarafından yönetilen bir dizi projem var. Benim daha çok ilgilendiğim şey, klasörün ne kadar büyük hale geldiğini belirlemekti. git gizli bir klasör kullandığından onu unutmak oldukça kolaydır. Yapmamak için bir PowerShell işlevi yazdım.
Temeller
Herhangi bir işlev oluştururken, her zaman, istediğiniz hedefin özüne ulaşan etkileşimli bir oturumda çalıştırabileceğiniz bir komut veya komut dizisiyle başlamanızı öneririm. Bu durumda, dosyaların bir dizin listesini almak ve toplam boyutu belirlemek oldukça basittir.
Get-ChildItem -Path C:\scripts\PSScriptTools\.git -file -Recurse | Measure-Object -Property Length -sum
Artık ifadenin işe yaradığını bildiğime göre onu fonksiyonumun temeli olarak kullanabilirim. Zaten tam cmdlet'im ve parametre adlarım var, bu bir artı. Şimdi bunu nasıl kullanmayı planladığımı düşüneceğim.
Klasörün her zaman .git olarak adlandırılacağını biliyorum. Büyük ihtimalle bir ana dizin yolu ileteceğim ve eğer .git varsa hesaplamaları çalıştıracağım. Bu, bir Yol parametresi tanımlayabileceğim ve onu boru hattı girişini kabul edecek şekilde yapılandırabileceğim anlamına gelir.
[Parameter(Position = 0, ValueFromPipeline, ValueFromPipelinebyPropertyName)]
[alias("pspath")]
[ValidateScript( {Test-Path $_})]
[string]$Path = "."
Ayrıca pspath takma adını da oluşturduğuma dikkat edin. Bunun nedeni, depolarımın çoğunun C:\Scripts altında olması ve dir c:\scripts -directory komutunu çalıştırıp işlevime yönlendirebilmek istememdir. Deneyimlerim sonucunda, pspath takma adını tanımlarsam bunun çok daha kolay işe yaradığını keşfettim.
Elimdeki yol ile test edilecek bir yol oluşturabilirim.
$full = Convert-Path -Path $Path
$git = Join-Path -Path $full -childpath ".git"
Tam bir dosya sistemi yolu elde etmek için yolu dönüştürüyorum. $path için '.' varsayılan değerini belirledim ve bunu tam dosya sistemi adına dönüştürebilmek istiyorum. Ayrıca join-Path'in kullanımına da dikkat edin. Yol oluşturmak için birleştirmeyi kullanmanın hiçbir nedeni yoktur. Ortalığı karıştırmak kolaydır ve kişisel olarak bunu yeni başlayan birinin işareti olarak görüyorum.
Bu yazının asıl amacının bu fonksiyonu nasıl oluşturduğum ve kullandığım teknikler olduğunu belirteyim. Sonuç faydalı ancak bu yazı için amacım bu değil. Git ve PowerShell ile ilgili çok sayıda araç mevcut.
Fonksiyon Çıkışı
Bir PowerShell işlevi oluşturduğunuzda, yalnızca tek bir şey yapması ve işlem hattına yalnızca tek türde bir nesne yazması gerekir. Bu fonksiyonla basit bir nesne oluşturmaya karar verdim.
[PSCustomObject]@{
Path = $full
Files = $stat.count
Size = $Size
} #customobject
Bunu yalnızca yerel olarak çalıştırmayı bekliyordum, bu nedenle Bilgisayaradı özelliğine ihtiyacım olduğunu düşünmedim. Sanırım bir DateTime özelliği ekleyebilirdim. Eğer giriş yapıyor olsaydım bu işe yarayabilirdi. Git benzeri dallardan veri alabilirdim. Ancak bu, farklı bir dizi gereksinime doğru kaymaya başlar. Bu işlev için ihtiyacım olan tek şey, klasörün ne kadar büyük olduğunun bir göstergesidir, böylece git gc'yi çalıştırmam gerekip gerekmediğini bilirim.
Önceden planlamak
Bununla birlikte fonksiyonuma bir özellik daha ekledim. Measure-Object bayt cinsinden bir değer sağlıyor. Bir şeyin 100 KB mı yoksa 100 MB mı olduğunu bir bakışta hızlı bir şekilde söyleme konusunda pek iyi değilim. Genellikle insanlara işlevinize herhangi bir biçimlendirme veya veri manipülasyonu dahil ETMEMELERİNİ söylerdim. Çıktımı kolayca Select-Object'e aktarabilir ve toplamı 1 KB veya 1 MB'a bölen özel bir özellik oluşturabilirim. Ancak PowerShell araç üreticilerine sürekli olarak aracınızı kimin, nasıl kullanacağını düşünmeniz gerektiğini söylüyorum. Bu durumda benim ve büyük olasılıkla değeri bayt dışında bir şeyde görmek isteyeceğini biliyorum. Bu yüzden bir $As parametresi ekledim.
[ValidateSet("kb", "mb", "gb")]
[string]$As
Ayrıca bir parametre doğrulama tekniği kullandığımı da unutmayın. Parametre seçimlerini bu 3 seçenekle sınırlandırıyorum. Daha da iyisi, ValidateSet'i kullandığım için PowerShell bu değerleri sekme tamamlamayla birlikte kullanacak!
İşlev
Şimdilik, işlevin tamamı Github'da çalışıyor.
https://Gist.github.com/jdhitsolutions/cbdc7118f24ba551a0bb325664415649
Bu işlev için başka planlarım var. Ancak şimdilik bunu tek bir klasörü kontrol etmek için kullanabilirim.
Veya bir dizinin tamamını kontrol edebilirim.
dir c:\scripts -directory | get-gitsize | Out-GridView -Title "Git Report"
Biraz ekstra çabayla basit bir kontrol komut dosyası oluşturabilirim.
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
}
Bunun nasıl kullanılacağı konusunda aklınızda başka fikirler olabilir. Eğer öyleyse, umarım paylaşırsınız. Eğlence.