Probleme mit der Datenbank unter Forgejo

Nach der Erstellung eines Pull Requests unter Forgejo ergab sich ein Datenbank-Fehler bzw. ein 500er-Reponse mit folgender Meldung:

GetIssuesByIDs, converting driver.Value type time.Time to a int64: unsupported value time.Time as int64

Ein Grund für das Problem könnte die Migrationen von Gogs zu Gitea zu Forgejo im Laufe der Jahre darstellen. Gelöst werden konnte das Problem durch eine Neuerstellung der Tabellen:

./forgejo doctor recreate-table --config custom/conf/app.ini

Anschließend funktionierte die Forgejo-Installation wieder ohne Probleme.

Gelöschte Dateien im Git-Log finden

Ab und an kommt es vor, dass eine Datei in einem Git-Projekt verschwunden ist. Besonders in größeren Repositorys oder bei längerer Historie stellt sich dann die Frage, wann wurde sie gelöscht und von wem?

Mit folgendem Befehl lassen sich gezielt alle Löschungen in der Git-Historie anzeigen:

git log --diff-filter=D --name-only

In der Ausgabe sind dann die einzelnen Commits, mit entsprechenden Löschungen zu sehen:

commit e14e40f43551902b1934635a9af6674d329df440
Author: seeseekey <>
Date:   Sun Dec 21 19:37:19 2025 +0100

    Remove set item command.

src/main/java/org/example/commands/SetCommand.java

commit 879fbec47cdaf7e788d2b78e385e89db65acb81d36
Author: seeseekey <>
Date:   Fri Nov 28 19:55:22 2025 +0100

    Restructure City generator.

src/main/java/org/example/commands/CityCommand.java

Damit lässt sich auf einen Blick nachvollziehen, wann, von wem und welche Dateien im Repository gelöscht wurden.

Merge unter Git erzwingen

Normalerweise ist ein Merge unter Git kein Problem. Im Terminal könnte das Ganze wie folgt aussehen:

git merge feature-xyz

Interessant wird es, wenn es dabei zu einem Fehler kommt:

fatal: refusing to merge unrelated histories

In diesem Fall besteht das Problem darin, dass die History des Quellbranches nicht mit der des Zielbranches zusammenhängt. Wer in einem solchen oder ähnliches Fall trotzdem einen Merge erzwingen möchte, kann dies mit einem zusätzlichen Parameter bewerkstelligen:

git merge feature-xyz --allow-unrelated-histories

Damit wird der Quellbranch zwangsweise in den Zielbranch gemergt.

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