Intelligente Lösungen
in neuer Dimension

Git - Paralleler kompakter Zweig

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:

  • mysqldump
  • 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

1
$ git push -f

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