2012-03-24 3 views
2

In meinem Projekt hatte ich versehentlich einige große Bilddateien zu meinem Repo hinzugefügt. Ich lese auf GitHub , wie Sie Dateien aus dem Verlauf entfernen, und es hat funktioniert: Sie können die Dateien im Verlauf nicht mehr sehen. Aber dann habe ich eine tar.gz von meinem Projekt für die Sicherung, und es ist jetzt zweimal die Größe, die es zu haben! Ich habe nichts hinzugefügt, was diese Erhöhung rechtfertigen könnte, daher ist mein Verdacht, dass die Repo-Daten, die die Bilddateien repräsentierten, nicht wirklich aus dem Repo geworfen wurden. Kann das jemand bestätigen? Gibt es eine Lösung?Wie kann ich Daten vollständig aus einem Git-Repository entfernen?

bearbeiten zu klären, ich über git recht wenig wissen, so dass ich genau wie auf den GitHub help pages angegeben, die Schritte unternahm, mit der einzigen Ausnahme, dass ich weiter einen force Wechsel von der zweiten Datei verwenden musste, wie in git filter-branch -f --index-filter ....

teilweise meine eigene Frage zu beantworten, ich glaube, ich von

  • Erstellen einer leeren Repo an einem anderen Ort
  • Wiedergabe der Datei Situation in verschiedenen Schritten ein zweites git Repo ohne die unerwünschten Materialien schaffen könnten von mein Projekt, unerwünschte wegzulassen
  • und schließlich das neue Repo anstelle der alten zu verwenden, um Materialien zu GitHub zu schieben.

hat das schon mal gemacht? Kann ich das neue Git Repo anstelle des alten mit dem gleichen Projekt auf GitHub verwenden?

BTW, für das, was es wert ist, ist dies über a presentation Ich schreibe gerade; Dort ist ein Bild des Turms von Babel drin, das in mehreren Versionen in hoher Auflösung existierte, was die Größe des Problems erklärt (~ 100MB an unerwünschten Daten).

bearbeiten 2 thx viel für Vorschläge; ich habe

rm -rf .git/refs/original/ 
git reflog expire expire=now --all 
git reflog expire --all 
git gc --aggressive --prune=now 

mit dem Effekt, dass die *.tar.gz Größe um lediglich 0,5% kleiner bekam ...

bearbeiten 3 es die schiere Komplexität zu erleben ist entmutigend, die git ist. Ich gebe an diesem Punkt auf. Ich habe einen Test mit einem kleinen Einweg-Repo gemacht; ich habe eine erste begehen, eine große Datei hinzugefügt, hat ein Commit, entfernt die Datei und versucht, seine Spuren aus dem Speicher mit

rm very-big-file.xcf 
git filter-branch --index-filter 'git rm --cached --ignore-unmatch very-big-file.xcf' --prune-empty -- --all 
rm -rf .git/refs/original/ 
git reflog expire --all 
git gc --aggressive --prune=now 

diese sind die aufgezeichneten *.tar.gz Größen zu löschen:

foo.tar.gz   7,518 
foo2.tar.gz 65,735,003 
foo3.tar.gz 32,777,155 

die große Datei komprimiert Größe ist 32.955.246 Bytes, die es völlig plausibel macht, dass es immer noch vollständig unter .git, vielleicht sogar in unkomprimierter Form vorhanden ist.

GIT Y U SO STUBBORN ??

Gibt es keine git purge Erweiterung, um dies zu tun? Ich meine, git filter-branch --index-filter 'git rm --cached --ignore-unmatch very-big-file.xcf' --prune-empty -- --all ist nicht genau das, was ich aus dem Speicher eingeben könnte, wenn ich einen leichten Kater habe.

+1

Können Sie möglicherweise ein wenig mehr darüber hinzufügen, wie Sie sie entfernt haben? Hast du 'git gc' laufen lassen? Haben Sie es mit 'git rm --cached' aus dem Index entfernt? – Nic

+0

@CaptainGiraffe, das ist in diesem Fall nicht notwendig. – Nic

+1

Sie haben die 'git filter-branch' Anweisungen befolgt und es in allen Zweigen gemacht, richtig? Hast du dann die Schritte 'rm -rf .git/refs/original /' und 'git reflog expire = now --all' und 'git gc --prune = now 'gemacht? – torek

Antwort

0

Ein schneller Weg ist es, die Geschichte genau so aussehen zu lassen, wie Sie wollen, fügen Sie das Repo als die Fernbedienung eines neuen leeren ein und dann holen Sie einfach. Sie erhalten nur die Referenzen und Objekte in der Geschichte, die sie darstellen.

Sie können dies jetzt zu einem neuen GitHub Repo schieben.

0

Re "edit 3" ... hier ist eine komplette Sequenz, die ich tatsächlich geloggt und versucht habe, dieses Mal Tippfehler zu beseitigen. :-) Beachten Sie, dass Sie nicht filter-branch nach dem Entfernen der großen Datei können, es sei denn, Sie bestätigen diese Entfernung (was für dieses Beispiel sinnlos ist). Überprüfen Sie den du -s Ausgang.

$ git init bigoop 
Initialized empty Git repository in /tmp/bigoop/.git/ 
$ cd bigoop 
$ echo tiny file with not much in it > tiny 
$ git add tiny 
$ git commit -m 'initial commit' 
[master (root-commit) bd07e5a] initial commit 
1 files changed, 1 insertions(+), 0 deletions(-) 
create mode 100644 tiny 
$ cp /path/to/huge/file hugefile 
$ git add hugefile 
$ git commit -m 'oops, add huge file' 
[master 25cd764] oops, add giant file 
1 files changed, 0 insertions(+), 0 deletions(-) 
create mode 100644 hugefile 
$ du -s .git 
618992 .git 
$ rm hugefile 
$ git filter-branch --index-filter 'git rm --cached --ignore-unmatch hugefile' --prune-empty -- --all 
Cannot rewrite branch(es) with a dirty working directory. 
$ git checkout hugefile 
$ git filter-branch --index-filter 'git rm --cached --ignore-unmatch hugefile' --prune-empty -- --all 
Rewrite 25cd7647f49173fa8f42c0ca0a2ab8baf1842fca (2/2)rm 'hugefile' 

Ref 'refs/heads/master' was rewritten 
$ du -s .git 
619012 .git 
$ rm -rf .git/refs/original/ 
$ git reflog expire --expire=now --all 
$ git gc --prune=now 
Counting objects: 3, done. 
Writing objects: 100% (3/3), done. 
Total 3 (delta 0), reused 0 (delta 0) 
$ du -s .git 
140  .git 

Wie für "GIT Y U SO STUBBORN ??" ... es arbeitet wirklich schwer, keine Sachen zu verlieren. Selbst wenn du versuchst Dinge zu verlieren. :-)

+0

ok, so dass es aussieht, als ob ich etwas verpasst habe; wird später noch einmal versuchen – flow