2012-12-23 4 views
11

Ich habe einen Fehler gemacht und eine Datei in einem Projekt in einem Git Repository enthält ein Passwort. Es ist kein Problem, weil es kein öffentliches Repo ist, aber ich möchte dieses Passwort im Repo loswerden.eine Datei in allen commits in git bearbeiten

Der Repository-Verlauf ist sehr einfach, da ich der einzige Entwickler bin, also hat es nur 12 Commits und eines der Commits ist markiert.

Die Änderung in diesem Fall hat keinen Einfluss auf die Historie (das Diff bleibt gleich), da das Passwort, das ich löschen möchte, nur vom allerersten Commit vorhanden ist. Ich möchte diese Saite entfernen, als ob sie nie dort gewesen wäre.

Gibt es irgendeine Art von Befehl, um dies zu tun, oder ich muss die Geschichte nur von Anfang an mit einem neuen Startpunkt ohne das Passwort neu generieren und die Diffs zusätzlich anwenden?

+1

I markiert diese als Duplikat http://stackoverflow.com/questions/1186535/how-to- modify-a-specify-commit, wo Sie Ihre Antwort haben. – zmo

+0

@zmo: Link, den Sie gaben, hat nichts mit dieser Frage zu tun.es kann sehr gut ein Duplikat von etwas sein, aber nicht von diesem – mvp

Antwort

6

Siehe https://help.github.com/articles/remove-sensitive-data. Die Datei wird in allen Commits vorhanden sein, wenn Sie sie nicht gelöscht haben, da alle Commits den Status des gesamten Repo enthalten.

Grundsätzlich, was Sie tun müssen, ist eine Filter-Verzweigung über alle Ihre Commits und dann zwingen, drücken Sie das in Repo. Der Befehl ist destruktiv und ändert alle Commits, bei denen die Datei im Repo vorhanden war. Seien Sie also vorsichtig.

+1

Um das zu erweitern: Sie suchen nach 'git filter-branch --tree-filter'. Übergeben Sie ein Skript an das, das die gewünschte Änderung vornimmt, und git überprüft jedes Commit, führt Ihr Skript aus und erstellt das Commit mit Ihren Änderungen neu. – Chronial

2

Danke, das war genau der Befehl, den ich gesucht habe und den Artikel und die filter-filial-Dokumentation gelesen habe. Ich habe genau die Syntax, die ich benutzen wollte, um die Zeichenfolge aus der Datei zu entfernen.

git filter-branch --tree-filter "sed -i 's/\<password\>//g' ./path_to_file/filename" --prune-empty --tag-name-filter cat -- --all 

Wo:

"Passwort" -> Ist die Zeichenfolge, die entfernt werden muss

"./path_to_file/filename" -> Ist der Pfad zur Datei in den Repo, die benötigt geändert werden

in der Repo-Wurzel ausgeführt hat den Trick wie ein Charme.

Nachdem die Änderung vorgenommen wurde, muss sie auf den Remote-Server übertragen werden. Dies muss erzwungen werden, damit der Server die komplett neu geschriebenen Refs und Tags akzeptiert.

So ein erzwungener Druck des Repo auf dem Remote-Server (Ursprung in den meisten Fällen)

git push origin --all --force 

Und ein erzwungener Druck von Tags an den Remote-Server

git push origin --tags --force 
+1

Beachten Sie, dass Sie auch a) zwingen müssen, das in den Repo zu schieben und b) danach alle lokalen Klone des Repos zu säubern. Deshalb habe ich einen längeren Artikel verlinkt und nicht versucht, alles hier einzubeziehen. – eis

+0

ja, nach dem Befehl habe ich gezwungen, sowohl Refs und Tags. Ich werde diese Antwort der Vollständigkeit halber bearbeiten. Vielen Dank. –

0

ich tun würde, die folgende :

git rebase --interactive 

ändern der Befehl pick vor dem ersten commit (commit mit dem Passwort) zu edit und behalten Sie alle anderen Linien, wie sie sind. Speichern Sie die Datei und beenden Sie sie.

Dann das Passwort aus der Datei (und tun alle anderen erforderlichen Änderungen), dann gilt:

git add name-of-file-with-password 
git commit --amend 
git rebase --continue