Sensible Daten aus einem Repository entfernen
Wenn Sie sensible Daten wie Passwörter oder SSH-Schlüssel in einem Git-Repository festschreiben, können Sie diese aus dem Verlauf entfernen. Zum vollständigen Entfernen unerwünschter Dateien aus dem Verlauf eines Repositorys können Sie den Befehl 'git filter-branch' oder das Open-Source-Tool BFG Repo-Cleaner verwenden.
Der Befehl git filter-branch
und BFG Repo-Cleaner schreiben den Verlauf Ihres Repositorys neu. Dadurch werden die SHAs bestehender Commits, die Sie geändert haben, und alle abhängigen Commits geändert. Geänderte Commit-SHAs können sich auf offene Pull Requests in Ihrem Repository auswirken. Wir raten dringend, alle offenen Pull Requests zu mergen oder zu schließen, bevor Sie Dateien aus Ihrem Repository entfernen.
Eine Datei aus dem letzten Commit können Sie auch mit git rm
entfernen. Informationen zum Entfernen einer Datei, die beim letzten Commit hinzugefügt wurde, finden Sie unter „Dateien aus dem Verlauf eines Repositorys entfernen“.
Warnung: Wenn Sie ein Commit per Push auf GitHub Enterprise übertragen, sollten Sie immer davon ausgehen, dass die Daten während der Übertragung auch abgegriffen werden könnten. Falls Sie ein Passwort festgeschrieben haben, ändern Sie es! Falls Sie einen Schlüssel festgeschrieben haben, generieren Sie einen neuen!
In diesem Artikel erfahren Sie, wie Sie Commits mit sensiblen Daten in den Branches und Tags Ihres GitHub Enterprise-Repositorys unzugänglich machen. Nicht verhindern lässt sich dadurch jedoch, dass diese Commits nach wie vor in Klonen oder Forks Ihres Repositorys, in zwischengespeicherten Ansichten auf GitHub Enterprise direkt über ihre SHA-1-Hashes und über alle referenzierten Pull Requests zugänglich sind. An bestehenden Klonen oder Forks Ihres Repositorys können Sie nichts ändern. Zwischengespeicherte Ansichten und Referenzen auf sensible Daten in Pull Requests auf GitHub Enterprise können Sie jedoch dauerhaft durch den Ihr GitHub Enterprise-Websiteadministrator entfernen lassen.
Datei aus dem Verlauf Ihres Repositorys löschen
Mit BFG
BFG Repo-Cleaner ist ein von der Open-Source-Community entwickeltes und verwaltetes Tool. Es ist zum Zweck des Löschens unerwünschter Daten eine schnelle und einfache Alternative zum Befehl git filter-branch
. Beispielsweise führen Sie zum Entfernen Ihrer Datei mit sensiblen Daten den folgenden Befehl aus, wobei Ihr letztes Commit von diesem Befehl unberührt bleibt:
$ bfg --delete-files YOUR-FILE-WITH-SENSITIVE-DATA
Zum Entfernen sämtlichen Texts, der in der Datei passwords.txt
enthalten ist, und zwar unabhängig davon, wo sich dieser im Verlauf Ihres Repositorys befindet, führen Sie folgenden Befehl aus:
$ bfg --replace-text passwords.txt
Ausführliche Informationen zum Download und zur Verwendung von BFG Repo-Cleaner finden Sie in dessen Dokumentation.
Mit „filter-branch“
Warnung: Wenn Sie git filter-branch
nach dem Stashing (Verbergen) von Änderungen ausführen, lassen sich diese Änderungen nicht mehr mit anderen Stash-Befehlen abrufen. Daher empfehlen wir vor der Ausführung von git filter-branch
das Wiedereinblenden (Unstashing) Ihrer Änderungen. Zum Wiedereinblenden des letzten von Ihnen verborgenen Änderungssatzes führen Sie git stash show -p | git apply -R
aus. Weitere Informationen finden Sie unter „Git Tools - Stashing“.
Zur Veranschaulichung der Funktionsweise von git filter-branch
zeigen wir Ihnen, wie Sie Ihre Datei mit sensiblen Daten aus Ihrem Repository-Verlauf entfernen und sie .gitignore
hinzufügen, um sicherzustellen, dass sie nicht versehentlich erneut festgeschrieben wird.
-
Wenn Sie noch keine lokale Kopie Ihres Repositorys haben, dessen Verlauf sensible Daten enthält, klonen Sie das Repository auf Ihren lokalen Computer.
$ git clone https://Hostname/YOUR-USERNAME/YOUR-REPOSITORY> Initialized empty Git repository in /Users/YOUR-FILE-PATH/YOUR-REPOSITORY/.git/ > remote: Counting objects: 1301, done. > remote: Compressing objects: 100% (769/769), done. > remote: Total 1301 (delta 724), reused 910 (delta 522) > Receiving objects: 100% (1301/1301), 164.39 KiB, done. > Resolving deltas: 100% (724/724), done.
-
Navigieren Sie zum Arbeitsverzeichnis des Repositorys.
$ cd YOUR-REPOSITORY
-
Führen Sie folgenden Befehl aus. Ersetzen Sie dabei
PATH-TO-YOUR-FILE-WITH-SENSITIVE-DATA
durch den Pfad der zu entfernenden Datei, nicht nur durch ihren Dateinamen. Diese Argumente bewirken Folgendes:- Sie zwingen Git, den gesamten Verlauf eines jeden Branches und Tags zu verarbeiten, nicht aber sie auszuchecken.
- Sie entfernen die angegebene Datei sowie alle leeren, als Ergebnis generierten Commits.
-
Sie überschreiben Ihre bestehenden Tags.
$ git filter-branch --force --index-filter \ "git rm --cached --ignore-unmatch PATH-TO-YOUR-FILE-WITH-SENSITIVE-DATA" \ --prune-empty --tag-name-filter cat -- --all > Rewrite 48dc599c80e20527ed902928085e7861e6b3cbe6 (266/266) > Ref 'refs/heads/master' was rewritten
Hinweis: Wenn die angegebene Datei mit sensiblen Daten auch unter anderen Pfaden vorliegt (weil sie verschoben oder umbenannt wurde), müssen Sie diesen Befehl auch für diese Pfade ausführen.
-
Fügen Sie Ihre Datei mit sensiblen Daten
.gitignore
hinzu, um sicherzustellen, dass sie nicht versehentlich erneut festgeschrieben wird.$ echo "YOUR-FILE-WITH-SENSITIVE-DATA" >> .gitignore $ git add .gitignore $ git commit -m "Add YOUR-FILE-WITH-SENSITIVE-DATA to .gitignore" > [master 051452f] Add YOUR-FILE-WITH-SENSITIVE-DATA to .gitignore > 1 files changed, 1 insertions(+), 0 deletions(-)
-
Vergewissern Sie sich, dass Sie alles aus Ihrem Repository-Verlauf entfernt haben, was Sie entfernen wollten, und dass alle Ihre Branches ausgecheckt wurden.
-
Wenn Sie mit dem Status Ihres Repositorys zufrieden sind, erzwingen Sie einen Push Ihrer lokalen Änderungen, um Ihr GitHub Enterprise-Repository wie auch alle Branches, die Sie per Push übertragen haben, zu überschreiben:
$ git push origin --force --all > Counting objects: 1074, done. > Delta compression using 2 threads. > Compressing objects: 100% (677/677), done. > Writing objects: 100% (1058/1058), 148.85 KiB, done. > Total 1058 (delta 590), reused 602 (delta 378) > To https://Hostname/YOUR-USERNAME/YOUR-REPOSITORY.git > + 48dc599...051452f master -> master (forced update)
-
Um die Datei mit sensiblen Daten aus Ihren getaggten Releases zu entfernen, müssen Sie auch einen „force-push“ an Ihren Git-Tags ausführen:
$ git push origin --force --tags > Counting objects: 321, done. > Delta compression using up to 8 threads. > Compressing objects: 100% (166/166), done. > Writing objects: 100% (321/321), 331.74 KiB | 0 bytes/s, done. > Total 321 (delta 124), reused 269 (delta 108) > To https://Hostname/YOUR-USERNAME/YOUR-REPOSITORY.git > + 48dc599...051452f master -> master (forced update)
-
Kontaktieren Sie den Ihr GitHub Enterprise-Websiteadministrator, um ihn zu bitten, zwischengespeicherte Ansichten und Referenzen auf die sensiblen Daten in Pull Requests auf GitHub Enterprise zu entfernen.
-
Weisen Sie Ihre Mitarbeiter an, ein Rebase, kein Merge, aller Branches auszuführen, die sie aus Ihrem alten, nicht zu verwendenden Repository-Verlauf erstellt haben. Durch einen Merge-Commit wird womöglich der gesamte unbrauchbare Verlauf, den zu entfernen Sie sich gerade die Mühe gemacht haben, wiederhergestellt.
-
Wenn Sie nach einer Weile zuversichtlich sind, dass die Ausführung von
git filter-branch
keine unerwünschten Folgen hatte, können Sie erzwingen, dass Referenzen auf alle Objekte in Ihrem lokalen Repository aufgehoben werden und entstandener „Müll“ dem Garbagekollektor übergeben wird (mit Git 1.8.5 oder einer früheren Version):$ git for-each-ref --format="delete %(refname)" refs/original | git update-ref --stdin $ git reflog expire --expire=now --all $ git gc --prune=now > Counting objects: 2437, done. > Delta compression using up to 4 threads. > Compressing objects: 100% (1378/1378), done. > Writing objects: 100% (2437/2437), done. > Total 2437 (delta 1461), reused 1802 (delta 1048)
Note: You can also achieve this by pushing your filtered history to a new or empty repository and then making a fresh clone from GitHub Enterprise.
Versehentliche Commits künftig vermeiden
Durch einige einfache Tricks vermeiden Sie den versehentlichen Commit von Änderungen, die nicht festgeschrieben werden sollen:
- Verwenden Sie zum Festschreiben von Änderungen ein visuelles Programm wie GitHub Desktop oder gitk. In visuellen Programmen ist meist leichter erkennbar, welche Dateien durch einen Commit hinzugefügt, gelöscht und geändert werden.
- Vermeiden Sie in der Befehlszeile möglichst die Verwendung der catch-all-Befehle
git add .
undgit commit -a
– verwenden Sie stattdessen die Befehlegit add filename
undgit rm filename
für das Staging einzelner Dateien. - Verwenden Sie
git add --interactive
, um die Änderungen jeder Datei einzeln zu überprüfen und per Staging für den Commit bereitzustellen. - Verwenden Sie
git diff --cached
, um die Änderungen zu überprüfen, die Sie per Staging für den Commit bereitgestellt haben. Sie sehen dadurch die exakte Differenz, diegit commit
generieren wird, sofern Sie nicht das Flag-a
verwenden.