2016-03-25 10 views
0

Ich weiß über Git Reset (einschließlich --hard), aber das Commit nicht vollständig entfernt, es passt nur die Struktur. Ich habe git gc untersucht, aber das scheint auch niemals einen Commit zu löschen. Ich kenne Filter-Branch, aber das entfernt nur Dateien von Commits, aber nicht selbst verpflichtet.Git: Wie lösche ich ein lokales Commit vollständig aus der git Datenbank

Es gibt viele Stapelüberlauf Fragen, die um dieses Thema kreisen, aber ich kann keine echte Antwort auf die Frage finden: Wie wirklich löschen Sie eine lokale Festschreibung (oder eine Reihe von Festlegungen), so dass es gibt es nirgendwo mehr in der Datenbank, als ob es nie überhaupt getan wurde? Wenn es sich um eine Methode handelt, die auf eine Zweigstelle beschränkt ist, wäre das in Ordnung.

EDIT: Es war ein Fehler meinerseits. Ich benutzte gitk und benutzte F5, um den gesamten Baum zu sehen. Aber F5 macht ein "update" und shift-F5 macht ein "reload". Und die Löschungen werden nicht wirklich angezeigt, wenn Sie nicht komplett neu laden, indem Sie die Umschalttaste-F5 drücken.

+0

Eine 'git reset --hard origin/master' durchführen – Sid

+0

Folgen Sie diesem Artikel und führen Sie die Schritte aus. https://help.github.com/articles/remove-sensitive-data/ –

+1

Zuerst ist Herkunft/Master für Remote-Repositories. Zweitens, wird zurückgesetzt - hard entfernt KEINE Commits, entgegen der landläufigen Meinung. Wenn Sie sich den gesamten Repository-Baum ansehen, sind sie immer noch da. – Nairebis

Antwort

1

Wenn Ihr Zweig wie folgt aussieht:

A <-- HEAD 
| 
B 
| 
C <-- to be removed 
| 
D 

und Sie entfernen möchten C verpflichten, den folgenden Befehl könnte Ihnen helfen:

git rebase -i D  # if you have D's sha1 handy 
# OR 
git rebase -i C^ # parent of C (which is the same as D in this simple example) 

Einmal ausgestellt, ein Editor öffnet sich mit allen commits ab 's Kinder, dh A, B und C in einer Todo-Liste. Entfernen Sie einfach die Zeile mit commit C in diesem Editor-Fenster und speichern Sie die Datei.

+0

Das löscht die ursprünglichen Commits nicht. Sie werden immer noch da sein. Ich habe dieses genaue Szenario ausprobiert. Die Rebase wird einfach zu einem anderen Zweig, aber die alten Commits sind immer noch da, wenn man den ganzen Baum betrachtet. – Nairebis

+2

@Nairebis Wo hast du gesucht? Gitk? Drücke SHIFT-F5 (neu laden). Du hast von _local_ commits erzählt. Hast du sie schon gedrängt? Dann 'push -f' – PerlDuck

+0

GAH! Du hast es genau richtig getroffen ... Ich habe Gitk benutzt und F5 statt Shift-F5 benutzt. Ich machte eine Schicht F5 und sie verschwanden. Teufel noch mal. – Nairebis

0
  1. Machen Sie das von jeder ref oder Tag nicht erreichbar begehen, mit reset, rebase oder sogar filter-branch. (Wie Filter-Zweig zu remove the file from all branches).
  2. Ablaufen des reflog verwenden, so dass die Übertragung von dort nicht erreichbar. git reflog expire --expire=now --all
  3. git prune unerreichbare Objekte aus der Datenbank zu entfernen. (git gc --prune=all habe auch den Trick getan, aber git gc Ebene hält lose Objekte, die jünger als zwei Wochen alt sind.)
  4. Sie können überprüfen, ob es tatsächlich verschwunden ist, indem Sie den Git-Objektspeicher manuell untersuchen.Ein Git-Objekt wird gemäß seinem SHA1-Hash gespeichert.Die ersten zwei Buchstaben des Hash sind ein Verzeichnis und die letzten 38 sind der Dateiname innerhalb dieses Verzeichnisses

Wenn also der SHA1-Hash des Problems zu begehen ist 12345ABCDEF... dann wird es bei .git/objects/12/345ABCDEF...

lebt wirklich paranoid zu sein, Sie den SHA1-Hash des spezifischen Blob herausfinden können (Dateiinhalte), die Sie besorgt über und Hash es mit git hash-object <filename>, und überprüfen Sie dann die DB für diesen Hash.