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:

Warum Repos archivieren?

Über die Jahre sammeln sich bei den meisten Entwicklern hunderte von Repositories an – Testprojekte, Tutorials, Forks, die man nie gebraucht hat. Das macht nicht nur die Übersicht schwieriger, sondern kann auch zu Sicherheitsproblemen führen: Veraltete Repos mit bekannten Sicherheitslücken in den Abhängigkeiten werden von Dependabot trotzdem noch gemeldet, was zu einer Flut von Benachrichtigungen führt.

Archivierte Repos sind weiterhin öffentlich sichtbar und können geklont werden, aber es können keine neuen Issues, Pull Requests oder Commits erstellt werden. Das signalisiert auch anderen Entwicklern klar, dass das Projekt nicht mehr aktiv gepflegt wird.

Die Automatisierung erweitern

Das PowerShell-Skript lässt sich leicht erweitern. Du könntest beispielsweise eine Whitelist einbauen, die bestimmte Repos von der Archivierung ausschließt, oder eine Benachrichtigung per E-Mail oder Discord senden, wenn Repos archiviert werden. Auch eine Kombination mit GitHub Actions ist möglich, um das Aufräumen regelmäßig automatisiert durchzuführen.

Weiterführende Artikel

Wenn dir dieser Artikel gefallen hat, könnten dich auch diese Beiträge interessieren:

Git: Die Geschichte, Anwendung und Vorteile der Quellcodeverwaltung
Git erklärt: Geschichte, Nutzung und Vorteile der Quellcodeverwaltung. Lerne Branching, Befehle und Produktivitätssteigerung! 🚀

Artikel teilen:Share article: