GitHub Repos automatisiert archivieren

GitHub-Repos schnell und einfach archivieren? Ich zeig dir wie!

GitHub Repos automatisiert archivieren
Photo by Roman Synkevych / Unsplash

Vor Kurzem hatte ich das Gefühl, dass meine GitHub-Repos langsam etwas zu viel werden. Viele davon habe ich seit Jahren nicht mehr angefasst, geschweige den tatsächlich richtig genutzt. Daher wollte ich alle meine Repos einmal aufräumen und alles, was älter ist als x Monate/Jahre, archivieren. Ich hatte aber keine Lust gefühlt 500 Repos manuell durchzugehen.

Das konnte recht einfach mit der GitHub CLI erledigt werden. Dazu muss die GitHub CLI installiert werden:

GitHub CLI
Take GitHub to the command line

Das Skript

Für mich als Windows-Nutzer lag es nahe, das Skript mit PowerShell "mal" eben aufzusetzen. Prinzipiell benutzt das Skript nur die GitHub CLI und holt sich aus dem Account (Ihr müsst natürlich eingeloggt sein) alle Repos und archiviert diese bzw. werden diese wahlweise noch in private geschaltet.

$org = "Disane87"
$limit = 400
$retentionDays = 182

(gh repo list $org -L $limit --json name,pushedAt) | ConvertFrom-Json | ForEach-Object {

    $repoData = $_;
    Write-Host "--------------------------------------------------"
    Write-Host "RepoName $($repoData.name)"

    $publishedDate = [datetime]::ParseExact($repoData.pushedAt, "M/d/yyyy H:mm:ss", $null)
    $timeDiff = New-TimeSpan -Start $publishedDate -End (Get-Date)

    if ($timeDiff.TotalDays -gt $retentionDays) {
        Write-Host "$($repoData.name) is older than $($retentionDays) days $($timeDiff.TotalDays)"

        gh repo edit "$($org)/$($repoData.name)" --visibility private
        gh repo archive $repoData.name -y
    }
}

Prinzipiell muss im Script nur euer GitHub-Username eingetragen werden und ggf. die Retention verändert werden. Im Standard ist diese 182 Tage.

Wenn Ihr Eure Repos nicht auf privatesetzen wollt, dann kommentiert einfach diese Zeile aus mit #

gh repo edit "$($org)/$($repoData.name)" --visibility private

Et voila, Euer GitHub ist aufgeräumt: