Anleitung um Binary Large Objects (BLOB) aus der Githistorie zu entfernen, aber anschließend weiterhin öffentlich verfügbar zu halten.
Disclaimer: Dies ist keine Schritt-für-Schritt Anleitung um alle möglichen Fälle abzudecken, sondern eher eine Übersicht über die zur Verfügung stehenden Werkzeuge. Wenn dein Fall über das geschilderte Beispiel hinaus geht, wende dich an die Documentation der aufgeführten Werkzeuge.
Öffentliche/Geteilte Repos
Das ist der generellere Fall, da die Optionen für private Repos nicht ohne weiteres zur Veröffentlichung deiner Daten geeignet sind.
- Find die Binärdateien, die du in deinem Repo committet hast
- Commandlinewerkzeuge wie
ncdu
können dir bei der Suche großer Dateien helfen. - Zum Zweck dieses Beispiels nehmen wir an du hast
data/my_training_set.bin
gefunden.
- Commandlinewerkzeuge wie
- Lege ein Backup des BLOBs außerhalb des Repos an
zip ../data.zip data/my_training_set.bin
- Überprüfe die Historie des BLOBs
tig data/my_training_set.bin
- Entferne die Datei aus deiner Historie
- 4.1 In einem kleinen Repo
git filter-branch --tree-filter 'rm -f data/my_training_set.bin'
- filter-branch arbeitet sehr langsam bei einer großen Anzahl Commits.
- 4.2 In einem großen Repo
- Find die Commit ID, zu der
data/my_training_set.bin
angelegt wurde, z.B. mittig data/my_training_set.bin
git rebase -i <commit-ID>~1
- z.B.
git rebase -i 272e7241548d564c3b13f15865cc5fb3c8058e82~1
- Folge der Beschreibung in deinem Editor um deinen Commit zum bearbeiten auszuwählen.
git rm data/my_training_set.bin
git commit --amend
git rebase --continue
- Wiederhole 4.2 falls du im Verlauf deiner Historie Änderungen an dem BLOB committet hast.
- Find die Commit ID, zu der
- 4.1 In einem kleinen Repo
- Verteile die neue Historie
git push --force
- Falls beim pushen ein Fehler auftritt, stelle sicher, dass deine Repoeinstellungen im GitLab dir Forcepushen erlauben.
- Verteile dein
data.zip
Die Uni bietet begrenzte, aber immerhin vorhandene, Möglichkeiten große Dateien zu veröffentlichen- faubox
wwwcip.cs.fau.de/~<dein_idm_nutzername>
was zu~/.www/
in deinem CIP Nutzerhome zeigt, sofern du einen CIP Account hast. Weiter kannst du Symlinks nach/proj/ciptmp/<your_idm_username>/
anlegen um mehr Platz zu haben. Beachte aber, dass es keine Backups des ciptmps gibt.- Falls keine dieser Möglichkeiten für dich anwendbar ist, bitte deinen Lehrstuhl dir eine Platform zur Veröffentlichung von Binärdateien zur Verfügung zu stellen.
Private Repos
Zusätzlich zu den Möglichkeiten für öffentliche Repos kannst du git annex
verwenden
um Binärdateien in einem git Repo zu verwalten. Siehe Annex Dokumentation.
Du kannst das WebDAV Remote verwenden um die FAUBox als Speicher an deinen Annex anzubinden.
Siehe Annex WebDAV Dokumentation
und FAUBox WebDAV Dokumentation.
Allerdings wäre eine GitLab ähnliche Platform mit Annexunterstützung notwendig, um
git annex
für öffentliche Repositories zu verwenden. Die FAU bietet derzeit keine
solche Platform an.
Weitere Gedanken
- Lege alle BLOBs in ein
./bindata
Verzeichnis in deinem Repo, füge/bindata
in deiner.gitignore
hinzu und lege Symlinks an alaln -s bindata/my_training_set.bin data/my_training_set.bin
sodass du deine Pfade nicht anpassen musst. Um eine neue Version deiner Binärdateien einzupflegen, entpacke einfach das neuedata.zip
nachbindata
. - Falls du bereits in der Vergangenheit BLOBs committet und in der Zwischenzeit wieder gelöscht hast, sind diese immernoch Teil deiner git Historie, tauchen aber nicht in einem aktuellen Checkout auf. Stelle sicher auch solche BLOBs vollständig aus deiner Historie zu entfernen.