Ich habe ein Git-Repo, in dem ich die Konfigurationsdateien
meiner zahlreichen Server und Container sichere.
Gelegentlich kommt es vor, dass ich die Betreuung einzelner
Server an Kollegen abgebe. Diese sind angehalten, das Git-Repo
aktuell zu halten.
Leider passiert es immer wieder, dass die Kollegen “Riesendateien”
einchecken und das Git-Repo damit für mich persönlich unbrauchbar
wird.
Meine Lust auf
andauerndes Aufräumen
endlose Diskussionen
ist gering.
Hier beschreibe ich, wie ich mich mit der Situation arrangiere.
Ermitteln: Wo beginnt der Schlammassel
Nachfolgend das Kommando zur Ermittlung des
ersten Auftretens der “großen Dateien”. Ich
erkenne sie am Namen. Wahrscheinlich kann man sich
recht einfach auch die Größe anzeigen lassen!
1
2
3
$ git log --name-status
# oder 'git log --name-only'
# oder auch 'git log --stat'
Bei mir ist:
der letzte OK-Hash: 813eb236c4b4ba61480573c789138d9b
der erste KO-Hash mit großer Datei: 61a5f7b27b82e517df6f68db348b3321
Neuen Zweig anlegen
1
2
3
4
5
$ git checkout -b uli-main 813eb236c4b4ba61480573c789138d9b
$ git push -u origin uli-main:uli-main
$ git remote -v
origin git@github.com:uli-heller/server-und-container-konfigurationen.git (fetch)
origin git@github.com:uli-heller/server-und-container-konfigurationen.git (push)
Neuen Clone erstellen ohne den “fetten” Zweig
1
2
3
$ cd .../git
$ # git clone -b (zweigname) --single-branch (repo-url) (verzeichnisname)
$ git clone -b uli-main --single-branch git@github.com:uli-heller/server-und-container-konfigurationen.git server-und-container-konfigurationen-uli
Platzbedarf
Mit du -hs server-und-container-konfigurationen*
kann man erkennen, dass die “uli-Variante” grob 1GB weniger
Speicherbedarf hat. Damit ist mein Ziel erstmal erreicht!
Weitere große Schrottdateien bereinigen
Für die Bereinigung verwenden wir
bfg-1.14.0.jar .
Dies verfügt über keinen “Trockenlauf”, das Repo wird also immer modifiziert.
Deshalb brauchen wir eine Trockenlauf-Kopie, damit wir unbeabsichtigte
Änderungen verwerfen können
BFG einspielen
Das Tool bfg-1.14.0.jar
herunterladen
virenprüfen
startbar via Start-Skript “bfg.sh”
Das Startskript “bfg.sh” könnte grob so aussehen:
1
2
#!/bin/sh
exec java -jar "$HOME/Downloads/bfg-1.14.0.jar" "$@"
Kopie erzeugen
1
2
$ cp -a server-und-container-konfigurationen-uli server-und-container-konfigurationen-tmp
$ cd server-und-container-konfigurationen-tmp
Große Dateien sichten
1
2
3
4
5
6
7
8
9
10
$ find . -size +1024k
./.git/objects/pack/pack-1aa8ccd3f0329857acd0e522961cb0fdb81ee8cf.pack
./.git/objects/pack/pack-1aa8ccd3f0329857acd0e522961cb0fdb81ee8cf.idx
./.git/index
./servers/internal.daemons-point.com/rootfs/var/www/html/keeweb/index.html
./servers/ikimai/bin/mysql-connector-java-8.0.21.jar
./servers/gitlab-runner-pag/rootfs/usr/local/bin/gitlab-runner
./obsolete-servers/igitbucket/gitbucket-mysql.dump
./Official_Installation_Kimai-2.7.0.pdf
./bin/q-x86_64-Linux
Bewertung
Folgende Dateien können weg:
./servers/gitlab-runner-pag/rootfs/usr/local/bin/gitlab-runner
./obsolete-servers/igitbucket/gitbucket-mysql.dump
./Official_Installation_Kimai-2.7.0.pdf
Löschen
1
2
3
4
5
6
7
8
9
10
11
12
$ git rm ./servers/gitlab-runner-pag/rootfs/usr/local/bin/gitlab-runner
$ git rm ./obsolete-servers/igitbucket/gitbucket-mysql.dump
$ git rm ./Official_Installation_Kimai-2.7.0.pdf
$ git commit -m "Große Dateien gelöscht"
$ bfg.sh --delete-files gitlab-runner
$ bfg.sh --delete-files gitbucket-mysql.dump
$ bfg.sh --delete-files Official_Installation_Kimai-2.7.0.pdf
$ git reflog expire --expire=now --all && git gc --prune=now --aggressive
$ git push -f
Große Dateien in der Historie
Skript: git-history.sh
1
2
3
4
5
6
git rev-list --objects --all |
git cat-file --batch-check='%(objecttype) %(objectname) %(objectsize) %(rest)' |
sed -n 's/^blob //p' |
sort --numeric-sort --key=2 |
cut -c 1-12,41- |
$(command -v gnumfmt || echo numfmt) --field=2 --to=iec-i --suffix=B --padding=7 --round=nearest
Führt bei mir zu dieser Anzeige:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
...
faf87a2ec657 570KiB obsolete-servers/igitbucket/gitbucket-export-143901791709498677.sql
11668ddcbdbf 682KiB servers/izammad/backup/mysqldump.20180517185153.sql.xz
cdb1252d1a68 715KiB servers/izammad/backup/mysqldump.20180529085635.sql.xz
7d2e864c79cd 746KiB servers/izammad/backup/mysqldump.20180606204059.sql.xz
72e3c8e8324a 1,3MiB servers/izammad/backup/mysqldump.20181101071650.sql.xz
d299d25723cc 1,3MiB servers/internal.daemons-point.com/rootfs/var/www/html/keeweb/index.html
2bb06d235667 1,4MiB servers/internal.daemons-point.com/rootfs/var/www/html/keeweb/index.html
369d0ee4af3d 1,5MiB servers/inextcloud18/backup/mysqldump.20200301094303.sql.xz
787834b0c52a 1,5MiB servers/inextcloud18/backup/mysqldump.20200131111752.sql.xz
51e270c46ffb 2,3MiB servers/ikimai/bin/mysql-connector-java-8.0.21.jar
634083ff8480 2,5MiB servers/izammad/backup/mysqldump.20190103085324.sql.xz
aef0782a5594 3,1MiB servers/inextcloud/nextcloud-mysql.dump
4bbf9149fa1b 3,9MiB servers/inextcloud/nextcloud-mysql.dump
bf0e92195fe4 5,2MiB servers/inextcloud/nextcloud-mysql.dump
0fc885c09f3c 5,4MiB servers/inextcloud/nextcloud-mysql.dump
31783fdff302 6,4MiB servers/inextcloud/nextcloud-mysql.dump
5c4a41608561 6,4MiB servers/inextcloud17/nextcloud-mysql.dump
83f39c32bcb3 6,5MiB servers/izammad/backup/mysqldump.20191204060150.sql.xz
e32e39e65370 10MiB bin/q-x86_64-Linux
Bewertung
Löschen möchte ich vermutlich:
mysql dump
mysql*xz
nextcloud*dump
gitbucket*sql
Doppelkontrolle
git-history.sh|grep 'mysql.*dump$'
–> passt!
git-history.sh|grep 'mysql.*xz$'
–> passt!
git-history.sh|grep 'gitbucket.*sql$'
–> passt!
Löschen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ git rm "**/*mysql.dump"
rm 'servers/inextcloud18/nextcloud-mysql.dump'
$ bfg.sh --delete-files "*mysql.dump"
$ git rm "**/*mysql*xz"
Schwerwiegend: Pfadspezifikation '**/*mysql*xz' stimmt mit keinen Dateien überein
$ bfg.sh --delete-files "*mysql*xz"
$ git rm "**/nextcloud*dump"
Schwerwiegend: Pfadspezifikation '**/nextcloud*dump' stimmt mit keinen Dateien überein
$ bfg.sh --delete-files "nextcloud*dump"
$ git rm "**/gitbucket*sql"
rm 'obsolete-servers/igitbucket/gitbucket-export-143901791709498677.sql'
$ bfg.sh --delete-files "gitbucket*sql"
Komprimieren
1
$ git reflog expire --expire=now --all && git gc --prune=now --aggressive
Speichern
Original aktualisieren und Kopie löschen
1
2
3
$ cd ../server-und-container-konfigurationen-uli
$ git pull --rebase
$ rm -rf ../server-und-container-konfigurationen-tmp
Historie
2024-03-03: Weitere Schrottdateien löschen
2024-03-02: Erste Version