Unerwünschte Datei aus Git-Repository vollständig entfernen

06.01.2024
Dieser Inhalt ist bereits etwas älter.
This content is already a bit old.
Bild

Vor kurzem habe war ich bei den Vorbereitungen zu einem Sync eines Repository auf GitHub, welches ich einige Zeit (und auch einige Commits) lange nur lokal mit Visual Studio verwendet hatte.

Als ich vor einiger Zeit mit Codesignatur-Zertifikaten getestet hatte, habe ich eine Batchdatei erstellt, welche einige Binärdateien im Debug-Ausgabeverzeichnis signiert.

Natürlich war darin der private Schlüssel des Codesignatur-Zertifikats gespeichert.

 

Was tun?

Nun, da es sich bei Git um eine Quellcodeverwaltung bzw. Versionierungstool handelt, ist ein einfaches Löschen und ein Commit der Änderung nicht die Lösung:

Bei einem Sync werden alle Änderungen übertragen, somit auch die gelöschte Batchdatei mit den sensiblen Informationen. Es wäre somit einfach möglich, sich den Diff des letzten Commits anzuzeigen...

Also musste ich hier schon etwas tiefer in die Trickkiste greifen. Zum Glück gibt es bei Git hierfür bereits einen bzw. mehrere Befehle, welche eine Datei aus allen Verweisen jedes Commits löschen können.

Hier empfehle ich die Seite https://help.github.com/en/articles/removing-sensitive-data-from-a-repository.

Ich hatte noch Glück: Ich hatte noch keinen Sync ausgeführt, also der private Schlüssel war noch nicht öffentlich geworden. Der im GitHub-Hilfeartikel beschriebene Befehl muss für GitHub for Windows etwas abgeändert werden. Hierzu wird die Installation von Git for Windows benötigt.

Also erst ein cd von der Git-Kommandozeile in das Git-Repository:

cd "Pfad zum Repository"

und dann mit

git filter-branch --force --index-filter \ "git rm --cached --ignore-unmatch <Dateiname>" --prune-empty --tag-name-filter cat -- --all

alle Verweise sowie Diffs zu der kritischen Datei entfernen. Dieser Vorgang hat bei mir einige Sekunden gedauert, da die Datei bereits in einigen Commits versioniert worden war.

Um in Zukunft zu verhindern, dass diese Datei oder andere sensible Dateien versioniert werden, muss die Datei .gitignore noch angepasst werden. Eine Hilfreiche Quelle ist hier auch der GitHub-Hilfeartikel https://help.github.com/en/articles/ignoring-files oder die Dokumentation von Git https://www.git-scm.com/docs/gitignore/1.9.0.


 

Feedback, suggestions for improvement, further ideas?

Simply use the contact form or send an email directly to info@kirgus.net.