Bitbucket: Ordner aus Git-Historie löschen

Beim Hosting von Git auf Bitbucket gibt es ein Hard Limit von 2 GB – wenn dieses überschritten wird, hat man lediglich Read-Only-Access auf das Repository. Um das zu verhindern, entfernt man beispielsweise rückwirkend große Ordner oder Dateien aus seinen Commits. Doch auch in anderen Fällen (wenn Zugangsdaten in die History gelangt sind oder mal wieder node_modules auf master gerutscht ist) muss man nachträglich die Historie von Git entgegen seiner Natur rückwirkend manipulieren.


Bitbucket hat dazu selbst einen ausführlichen Artikel verfasst. Um das Ganze an einem Fall durchzuspielen, legen wir zunächst ein neues Repository an:

bitbucket history clean

Dann klonen wir das Repository in einen leeren Ordner auf den lokalen Rechner:

6ab7686fc508ce87c52b10bb5d01ee51

Nun erzeugen wir zwei Unterordner mit Dateien zufälligen Inhalts:

6ab7686fc508ce87c52b10bb5d01ee51

Wir pushen nun auf master:

6ab7686fc508ce87c52b10bb5d01ee51

Nun haben wir das Hard Limit von 2 GB auf Bitbucket fast erreicht:

bitbucket history clean

Auch lokal können wir das prüfen (siehe "size-pack"):

6ab7686fc508ce87c52b10bb5d01ee51

bitbucket history clean

Nun besteht die Aufgabe darin, "foo" rückwirkend aus dem Repository zu entfernen, um dessen Größe zu halbieren. Dazu bearbeiten wir zunächst den aktuellen HEAD und schreiben den Ordner in die gitignore:

6ab7686fc508ce87c52b10bb5d01ee51

Schließlich entfernen wir mit Hilfe des BFG Repo Cleaner den Ordner (BFG benötigt als Systemvoraussetzung eine aktuelle JRE auf dem System):

6ab7686fc508ce87c52b10bb5d01ee51

Wir sehen nun lokal das Resultat:

6ab7686fc508ce87c52b10bb5d01ee51

bitbucket history clean

Doch auf Bitbucket hat sich die Repository-Größe noch nicht verändert, da der Garbage-Collector remote noch nicht ausgeführt wurde und bitbucket nicht bei jedem push ein "git gc" ausführt:

bitbucket history clean

Dies bestätigt auch der Support:

bitbucket history clean

Demnach sendet man am besten direkt an support@bitbucket.org eine Anfrage, manuell "git gc" im Repository auszuführen. Nach kurzer Zeit geschah dies auch durch das Support-Team:

bitbucket history clean

Zieht man sich nun "frisch" das Repository auf einen anderen Rechner, landen auch nur 0,9 GB auf der Platte. Hat jemand die 1,8 GB Version noch lokal vorgehalten, genügt ein "git pull" gefolgt von "git gc".

Zurück