Git - Entfernen Sie Commits mit leerem Änderungssatz mithilfe des Filterzweigs

75

Wie entferne ich Commits ohne Änderungssatz mit git filter-branch?

Ich habe meinen Git-Verlauf umgeschrieben mit:

git filter-branch --tree-filter 'rm -r -f my_folder' -f HEAD

Das hat gut geklappt, aber jetzt habe ich viele Commits mit leeren Änderungssätzen. Ich möchte diese Commits entfernen. Am besten in msysgit.

Rebasing ist keine Option, da ich über 4000 Commits habe und die Hälfte davon entfernt werden muss.

Paul Pladijs
quelle
4
Für zukünftige Besucher ist --index-filtermit git rm -r --ignore-unmatch --cached my_folderviel schneller als --tree-filterda es nicht jede Revision überprüfen muss. Es arbeitet vollständig mit dem Index.
Vmrob
3
Und falls Sie die Arbeit bereits erledigt haben ( --tree-filter ...) und jetzt nur die verbleibenden leeren Commits loswerden möchten, hat dies meinen Speck gerettet: git filter-branch --prune-empty(nur den filter-branchBefehl ohne 'Filter') - wie unter stackoverflow.com/questions/28313664 zu finden /… - Dies ist nützlich, wenn Jefromis Antwort unten ( stackoverflow.com/questions/5324799/… ) den Fehlerbericht erstelltFound nothing to rewrite
Ger Hobbelt

Antworten:

71

Fügen Sie einfach die --prune-emptyOption hinzu:

git filter-branch --tree-filter 'rm -rf my_folder' --prune-empty -f HEAD

(Und natürlich, wenn Sie andere Refs haben, möchten Sie vielleicht alles neu schreiben, -- --allanstatt nur HEAD.)

Beachten Sie, dass dies nicht kompatibel ist mit --commit-filter; In diesem Fall hat Charles Bailey Ihre Antwort .

Cascabel
quelle
49

Wenn Sie nur nach der Dokumentation suchen filter-branch, sollten Sie in der Lage sein, Folgendes zu tun:

git filter-branch --commit-filter 'git_commit_non_empty_tree "$@"' HEAD
CB Bailey
quelle
4
+1 dafür. Sehr nützlich, wenn Sie ein SVN-Repository konvertiert haben, das normalerweise viele leere Commits generiert
Fabio
Dieser Befehl entfernt in meinem Fall nicht alle leeren Commits, aber leider weiß ich nicht warum. Irgendeine andere Idee?
SeB.Fr
2
@ SeB.Fr: Ich weiß nicht, ob dies Ihre Situation ist, aber möglicherweise diese ?
CB Bailey
Es wirft diese Nachricht für mich aus: fatal: mehrdeutiges Argument '$ @' ': unbekannte Revision oder Pfad nicht im Arbeitsbaum. Verwenden Sie '-', um Pfade von Revisionen wie
folgt
Update: Es hat unter Windows 10 nicht funktioniert, aber zum Glück gibt es Ubuntu im Windows 10-Jubiläumsupdate.
Hat