Sie können das binäre Aufblähen entfernen und den Rest Ihres Verlaufs behalten. Mit Git können Sie frühere Commits neu anordnen und "quetschen", sodass Sie nur die Commits kombinieren können, die Ihre großen Binärdateien hinzufügen und entfernen. Wenn die Hinzufügungen alle in einem Commit und die Entfernungen in einem anderen durchgeführt wurden, ist dies viel einfacher als der Umgang mit jeder Datei.
$ git log --stat # list all commits and commit messages
Suchen Sie hier nach den Commits, die Ihre Binärdateien hinzufügen und löschen, und notieren Sie sich deren SHA1s, z . B. 2bcdef
und 3cdef3
.
Verwenden Sie dann zum Bearbeiten des Repo-Verlaufs den rebase -i
Befehl mit seiner interaktiven Option, beginnend mit dem übergeordneten Element des Commits, in dem Sie Ihre Binärdateien hinzugefügt haben. Es wird Ihr $ EDITOR gestartet und Sie sehen eine Liste der Commits, beginnend mit 2bcdef
:
$ git rebase -i 2bcdef^ # generate a pick list of all commits starting with 2bcdef
# Rebasing zzzzzz onto yyyyyyy
#
# Commands:
# pick = use commit
# edit = use commit, but stop for amending
# squash = use commit, but meld into previous commit
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
pick 2bcdef Add binary files and other edits
pick xxxxxx Another change
.
.
pick 3cdef3 Remove binary files; link to them as external resources
.
.
squash 3cdef3
Als zweite Zeile einfügen und die Zeile mit der Aufschrift pick 3cdef3
aus der Liste entfernen . Sie haben jetzt eine Liste von Aktionen für das Interaktive rebase
, die die Commits, die Ihre Binärdateien hinzufügen und löschen, zu einem Commit zusammenfassen, dessen Unterschied nur alle anderen Änderungen in diesen Commits sind. Dann werden alle nachfolgenden Commits der Reihe nach erneut angewendet, wenn Sie anweisen, dass sie abgeschlossen werden sollen:
$ git rebase --continue
Dies dauert ein oder zwei Minuten.
Sie haben jetzt ein Repo, in dem die Binärdateien nicht mehr kommen oder gehen. Sie beanspruchen jedoch weiterhin Speicherplatz, da Git Änderungen standardmäßig 30 Tage lang aufbewahrt, bevor sie mit Müll gesammelt werden können, sodass Sie Ihre Meinung ändern können. Wenn Sie sie jetzt entfernen möchten:
$ git reflog expire --expire=1.minute refs/heads/master
#all deletions up to 1 minute ago available to be garbage-collected
$ git fsck --unreachable # lists all the blobs(files) that will be garbage-collected
$ git prune
$ git gc
Jetzt haben Sie das Aufblähen entfernt, aber den Rest Ihrer Geschichte beibehalten.
Sie können
git filter-branch
mit Transplantaten das Commit Nummer 4 zum neuen Root-Commit Ihres Zweigs machen. Erstellen Sie einfach die Datei.git/info/grafts
mit nur einer Zeile, die den SHA1 von Commit Nummer 4 enthält.Wenn Sie jetzt ein
git log
oder tun, werdengitk
Sie sehen, dass diese Befehle die Commit-Nummer 4 als Stamm Ihres Zweigs anzeigen. In Ihrem Repository hat sich jedoch nichts geändert. Sie können löschen.git/info/grafts
und die Ausgabe vongit log
odergitk
wird wie zuvor sein. Um Commit Nummer 4 tatsächlich zum neuen Root zu machen, müssen Siegit filter-branch
ohne Argumente ausführen .quelle
git gc --prune=0
scheint sie nicht aufzuräumen.git gc --prune=now
bereinigt physisch alle Commits, auf die nicht mehr verwiesen wird. Wenn dies bei Ihnen nicht funktioniert, haben Sie möglicherweise einen Remote-Tracking-Zweig, der immer noch auf den alten Stamm verweist. Liste mitgit branch -r
, entferne dann den Remote-Zweig zum Beispiel mitgit branch -rd origin/master
und führe ihn danngit gc --prune=now
erneut aus.Dank des Beitrags von JesperE, den ich mir angesehen habe
git-filter-branch
, ist das vielleicht genau das, was Sie wollen. Es sieht so aus, als könnten Sie auch Ihre früheren Commits beibehalten, außer sie würden geändert, da Ihre Big Files entfernt wurden. Aus der Manpage zu git-filter-branch :Lesen Sie unbedingt diese Manpage ... natürlich möchten Sie dies auf einem Ersatzklon Ihres Repositorys tun, um sicherzustellen, dass es wie erwartet funktioniert.
quelle
Ist
git-fast-export
was du suchst?quelle