Größe der Packdateien unter Git beschränken

Im Versionsverwaltungssystem Git existieren im Repository sogenannte Packfiles. Diese werden genutzt um mehrere Objekte, wie z.B. Commits, Trees, Blobs oder Tags, als einzelne Dateien abzulegen. Damit fasst Git viele Objekte zu einer einzelnen komprimierten Datei zusammen. Ergänzt wird das ganze durch einen Index, um einen schnellen Zugriff zu ermöglichen. Dabei nutzt Git Delta-Kompression, indem es ähnliche Objekte, z. B. verschiedene Versionen derselben Datei, nicht vollständig speichert, sondern nur die Unterschiede.

Eine Git-Pack-Datei im Schema

Dies reduziert die Repository-Größe erheblich, kann aber bei ungünstigen Repositorys mit vielen Binärdaten zu Repositorys führen, welche mehrere dutzend Gigabyte große Pack-Dateien besitzen. Eine Steuerung ist über den Konfigurationsparameter pack.packsizelimit möglich:

git config pack.packsizelimit 5g

Damit würde diese Einstellung für das aktuelle Repository gesetzt werden. Wer das Ganze global benötigt, kann dies ebenfalls einstellen:

git config --global pack.packsizelimit 5g

Allerdings gilt diese Einstellung nicht sofort, stattdessen muss für ein Repack gesorgt werden:

git repack -Ad --max-pack-size=5g

Anschließend kann die Größe der Packs kontrolliert werden:

ls -lh .git/objects/pack

Allerdings sollte beachtet werden, das die Option grundsätzlich nur in Ausnahmefällen sinnvoll ist:

Note that this option is rarely useful, and may result in a larger total on-disk size (because Git will not store deltas between packs) and worse runtime performance (object lookup within multiple packs is slower than a single pack, and optimizations like reachability bitmaps cannot cope with multiple packs).

Umstellung des master-Branch auf main-Branches in Forgejo

Der Standard-Branch in Git ist seit einiger Zeit main, anstatt des veralteteten master. Wer Projekte, die Forgejo nutzen, vom Branch master auf main umstellen möchte, muss den Standard-Branch entsprechend anpassen. Im ersten Schritt sollte lokal der main-Branch aus dem master-Branch erzeugt und auf den Server gepusht werden:

git checkout master
git branch -m main
git push -u origin main

Anschließend kann in Forgejo der Standardbranch von master zu main geändert werden. Dies geschieht in den Einstellungen des Repositories unter Branches:

Die Einstellungen des Repository

Nun kann der Branch auf dem Git-Server gelöscht werden:

git push origin --delete master

Ist dies geschehen, kann der lokale Branch ebenfalls gelöscht werden:

git branch -D master

Auf verbleibenden lokalen Repositories kann die Aktualisierung nun wie folgt vorgenommen werden:

git pull
git checkout main
git branch -D master

GitHub zu Codeberg spiegeln

Im Rahmen digitaler Souveränität ist das Hosten auf GitHub eine zwiespältige Sache. Während die zugrundeliegenden Werkzeuge wie Git frei verfügbar sind, trifft dies auf Plattformen wie GitHub nicht zu.

Allerdings existieren auch Alternativen, wie Codeberg. Dabei handelt es sich um eine gemeinnützige, community-getriebene Plattform für die Entwicklung und das Hosting von Open-Source-Softwareprojekten. Betrieben wird sie vom eingetragenen Verein Codeberg e.V. mit Sitz in Berlin. Die Plattform bietet eine datenschutzfreundliche Alternative zu kommerziellen Diensten wie GitHub und richtet sich an Entwickler:innen, die Wert auf Transparenz, Offenheit und digitale Souveränität legen.

Die Plattform Codeberg

Nun ist ein vollständiger Wechsel für viele Nutzer nicht unbedingt immer möglich. Eine Alternative ist dann unter Umständen die Nutzung zweier Plattformen wie GitHub und Codeberg und eine entsprechende Spiegelung. Die der Codeberg zugrundeliegende Plattform Forgejo beherrscht die Spiegelung von Repositories. Allerdings ist dieses Feature auf der Plattform mit Absicht deaktiviert.

Wer eine solche Synchronisation nutzen möchte, ist damit auf weitere Werkzeuge angewiesen. Eines dieser Werkzeuge ist Gickup. Nach der Installation:

brew install gickup

sollte eine Konfigurationsdatei mit dem Namen conf.yml angelegt werden. Eine Minimalkonfiguration könnte folgendermaßen aussehen:

source:
  github:
    - token: topsecret-github-token
      includeorgs:
        - Entitaet
        - seeseekey
      wiki: true
      issues: true
destination:
  gitea:
    - url: https://codeberg.org/
      token: topsecret-codeberg-token
      createorg: true
      mirror:
        enabled: true

Diese Konfiguration stellt sicher, dass nur gewünschte Organisationen synchronisiert werden und dass Repositories von Organisationen, als solche in Codeberg angelegt werden. Die Token müssen auf GitHub und Codeberg angelegt werden und anschließend in der Konfiguration hinterlegt werden. Für GitHub wird dieses Token in den Einstellungen erzeugt. Hier sollte ein Classic-Token erzeugt werden und die Rechte für repo sollten zugewiesen werden.

Für GitHub werden die repo-Berechtigungen benötigt

Unter Codeberg wird das neue Token ebenfalls in den Einstellungen unter Anwendungen angelegt.

Das Token für Codeberg wird erzeugt

Nachdem die Token in der Konfiguration hinterlegt worden sind, kann der Prozess mittels gickup gestartet werden:

2025-05-20T21:18:50+02:00 INF Reading conf.yml file=conf.yml
2025-05-20T21:18:50+02:00 INF Configuration loaded destinations=1 pairs=1 sources=1
2025-05-20T21:18:50+02:00 INF Backup run starting
2025-05-20T21:18:50+02:00 INF grabbing my repositories stage=github url=https://github.com
2025-05-20T21:19:20+02:00 INF starting backup for https://github.com/Entitaet/autoxylophon.git stage=backup
2025-05-20T21:19:20+02:00 INF mirroring autoxylophon to https://codeberg.org/ stage=gitea url=https://codeberg.org/
2025-05-20T21:19:21+02:00 INF already up-to-date stage=gitea url=https://github.com/Entitaet/autoxylophon.git

Je nach Größe der eigenen Repositories kann die Spiegelung einige Minuten in Anspruch nehmen. Ist eine Aktualisierung gewünscht, so kann der Prozess einfach erneut angestoßen werden. Neben dieser Möglichkeit existieren weitere Möglichkeiten, um eine Spiegelung von Repositories zu Codeberg zu realisieren.

Hidden-Attribut von Dateien unter macOS entfernen

Wenn eine Datei unter macOS versteckt ist, so ist das Hidden-Attribut der Datei gesetzt oder ein Punkt vor der Datei bzw. dem Ordner gesetzt, z.B. im Fall .git. Für ersteren Fall, also Dateien, welche ohne Punkt beginnen und trotzdem versteckt sind, kann das Hidden-Attribut über einen Befehl im Terminal entfernt werden:

chflags nohidden text.txt

Soll die Datei wieder versteckt werden, so kann dies mit dem Befehl:

chflags hidden text.txt

bewerkstelligt werden.

Gitea-Fork Forgejo

Wer Git-Repositorys nutzt und hierfür eine zentrale Anlaufstelle nutzt, kann Systeme wie GitHub nutzen. Daneben existieren auch Alternativen für die Nutzung im selbst gehosteten Umfeld, wie Gogs, aus welchem später Gitea hervorging.

Forgejo in der Nutzung.

Aufgrund der Gründung der Gitea Limited, welche kommerzielle Dienste rund um Gitea anbot, entwickelte sich der Fork Forgejo, welcher mittlerweile beim Non-Profit-Hoster Codeberg genutzt wird.

Nach einem anfänglichen Soft-Fork, handelt es sich mittlerweile um einen Hard-Fork, sodass eine Kompatibilität zu Gitea nicht mehr gegeben sein muss. Aktuell können Migrationen von Gitea zu Forgejo noch problemlos vorgenommen werden, sodass sich ein prüfender Blick auf Forgejo lohnt.