
Mi[cr]+o-Stories: Besseres Git-Archiv
So kann ein erfolgreicher Tag aussehen: Aus 4 Zeilen mit 205 Zeichen wird 1 Zeile mit 53 Zeichen ;)
Mein Alltag ist geprägt von Technikkram. Daher nach 11 Jahren Blog, ab heute mal was ganz Neues - winzige Tagebucheinträge aus dem Techie-Alltag. Was für eine revolutionäre Idee für einen Blog ... Egal, ausnahmsweise mag ich mal meinen Titel. Den Beginn macht eine kleine Optimierung, die mir das mit dem Wald und den Bäumen nochmal vor Augen geführt hat.
Vor einiger Zeit habe ich mal an einem Artikel zu Synthetic-Monitoring in Checkmk, aka Robotmk gearbeitet. Und aus an dieser Stelle ganz sicher nicht erklärbaren Gründen, musste ein Archiv erstellt werden. Inhalt: Die Dateien des aktuellen Verzeichnisses. Und da es sich um ein Git-Verzeichnis handelt: Exklusive aller Git-eigenen sowie explizit von Git ignorierter Dateien.
Dafür wurde mir ein kleines Snippet zugeliefert, das in der Windows-Variante leicht fehlerhaft war. Also habe ich es so wenig wie möglich verändert und heraus kam:
$FolderName=(Get-Item .).Name
cp -r . "$env:TEMP\"
rm -r "$env:TEMP\$FolderName\$(git ls-files --others --ignored --exclude-standard)"
Compress-Archive "$env:TEMP\$FolderName" "../$FolderName.zip" -Force
rm -r -fo $env:TEMP\$FolderName
Dieses Powershell-Skriptchen kopiert alle Dateien in ein temporäres Verzeichnis, löscht die überflüssigen Dateien, erstellt ein Archiv und löscht die temporären Dateien dann wieder komplett.
Und auch wenn dieser Weg ziemlich hässlich ist - er hat beim Testen funktioniert, also habe ich nicht nach einer eleganteren Variante gesucht. Aber es gibt ein kleines Problemchen: Git bleibt stumm, wenn nichts ignoriert wird. Ja logo ...
Der git-Befehl oben soll alle Dateien auflisten, die nicht zu den eigentlichen Projektdateien gehören, also per gitignore-Datei ignorierter Dateien, Git-eigene Dateien sowie sonstige nicht verwaltete Dateien. Und das tut er auch!
Und dann löscht der rm-Befehl alle so aufgelisteten Dateien unterhalb von "TEMP\ORDNERNAME\". Aber wie gesagt, git bleibt stumm, wenn es keine solchen Dateien gibt. Mit anderen Worten: der rm-Befehl bekommt den ganzen Ordner zu fressen und löscht entsprechend alle relevanten Dateien statt der nicht vorhandenen irrelevanten Dateien ...
Wald und Bäume
Wie solch Code entsteht, ist eigentlich klar: Man spielt mit der Archivierung eines Verzeichnisses - kein Problem. Dann kommt der Gedanke an Git - oh, schnell noch was Gittiges anflanschen, sieht gut aus, weiter im Text.
Hände hoch, wer alle - ALLE - Git-Möglichkeiten immer parat hat. Aber zu wissen, dass Git mehr kann als man im Alltag nutzt, reicht schon für eine naheliegende und deutlich elegantere Variante:
$FolderName = (Get-Item .).Name
git archive --format=zip -o "../$FolderName.zip" HEAD
Natürlich kann Git selbst archivieren, da braucht es keine Powershell-Befehle.
Das Archivieren eines aktuellen, lokalen Git-Repositories dürfte auch eine durchaus übliche Aufgabe sein. Und da bietet Git noch eine schöne Option:
git archive --format=zip --prefix=mein-ordner -o foobar.zip HEAD
Über prefix lassen sich alle Dateien statt direkt in das Wurzelverzeichnis des Archivs in einen gemeinsamen Ordner packen. Ein großer Vorteil: Der übliche "Hier entpacken"-Befehl stopft nicht versehentlich den aktuellen Ordner voll. Hand hoch, wer sich so noch nie den Download-Ordner vermüllt hat ...
Und für alle, die sich fragen, was der bescheuerte Titel soll - das hier hilft, Transferleistung müsst Ihr selbst erbringen 😉





