2013-01-01 8 views
7

Ich habe eine Situation mit einem beschädigten Objekt in einem Repository.Entfernen git korrupten Blob aus dem Repository

$ git push 
... 
fatal: loose object 95b6a826cadae849f4932a71d6735ab6ceb47cab (stored in .git/objects/95/b6a826cadae849f4932a71d6735ab6ceb47cab) is corrupt 
... 

Und ich weiß, dass diese objet ein Blob von einem alten verknüpft ist begehen:

$ git fsck --full 
Checking object directories: 100% (256/256), done. 
broken link from tree 27e8e7d5b94c1dad5410a8204089828a167a0eaf 
      to blob 95b6a826cadae849f4932a71d6735ab6ceb47cab 

Ich habe die classic steps to recover the blob from the FAQ getan, aber es scheint, dass es keine andere Kopie davon ist überall, dass ich finden kann (Ich arbeite alleine und habe nicht eine Weile an die Fernbedienung gedrückt, also ist es nicht da), also kann ich es nicht wiederherstellen.

Dieser Blob ist eigentlich die erste Version einer Datei, die seither stark verändert wurde. Mir geht es gut, die Informationen über diese Version der Datei zu verlieren. Also möchte ich es nur aus dem Commit entfernen, das darauf zeigt. Wie kann ich das machen?

+0

Versuchen Sie, einige der Lösungen hier zu betrachten: http://stackoverflow.com/q/4254389/1031900 –

+0

Diese Frage bezieht sich auf einen beschädigten Baum, der ein bisschen anders ist. Keine dieser Antworten kann mir leider helfen. Ich werde ein paar Dinge versuchen und werde es hier posten, wenn sie funktionieren. –

Antwort

4

OK, ich habe es irgendwann selbst herausgefunden.

Kurzfassung: Ich habe das Commit geändert, das auf das beschädigte Blob zeigt, um es aus dem Verlauf zu entfernen.

Lange Version: Ich dachte, dass, da ich wusste, was die Datei war, und wollte es einfach aus dem Commit verschwinden lassen, dann konnte ich nur das alte Commit ändern. Ich habe nicht wirklich erwartet, dass es funktioniert, aber irgendwann hat es funktioniert.

Ich muss darauf hinweisen, dass ich den Blob in .git/objects in dem Versuch, vorherige Dinge zu entfernen, und es ist möglicherweise wichtig, warum es funktionierte.

Zuerst musste ich wissen, was es zu begehen war. Dafür verwendete ich den Befehl

git log --raw --all --full-history -- subdir/my-file 

ich das gefunden wurde 966a46 genannt commit ....

Dann habe ich die Schritte, um es zu ändern. Da es sich um eine alte begehen war, habe ich

git rebase -- interactive 966a46^ 

Mein Redakteur mit einer Zeile kam für jede begehen, und ich änderte „Pick“ auf „Bearbeiten“ vor dem Commit ich ändern wollte.

Der Befehl git status zeigte mir, dass ich die Datei wurde geändert, um löschen wollte:

# Changes not staged for commit: 
# (use "git add <file>..." to update what will be committed) 
# (use "git checkout -- <file>..." to discard changes in working directory) 
# 
#  modified: subdir/my-file 

ich es von der commit entfernen wollte, so habe ich rm subdir/my-file. git status dann hat mir gezeigt:

#  deleted: subdir/my-file 

Das sah vielversprechend aus. So beging ich einfach die geänderte begehen und setzte die Fütterungsmaterial:

git commit --all --amend 
git rebase --continue 

aber nach ein paar umbasiert haben begeht es konnte nicht mit diesem Fehler:

error: could not apply 45c2315... did some fancy things 
fatal: unable to read 95b6a826cadae849f4932a71d6735ab6ceb47cab 

45c2315 wurde das erste, in dem commit meine Datei geändert wurde nachdem er erstellt wurde. Da die vorherige Version der Datei nicht gefunden wurde, ist sie einfach fehlgeschlagen.

git status hat mir gezeigt, unter anderem:

# Unmerged paths: 
# (use "git reset HEAD <file>..." to unstage) 
# (use "git add/rm <file>..." as appropriate to mark resolution) 
# 
#  deleted by us:  subdir/my-file 

Ich bin eigentlich nicht sicher, was es bedeutet, aber dies sollte Festschreibung der erste sein, in dem die Datei nach dem Update erscheinen würde. Also wollte ich nicht, dass es gelöscht wird, sondern im Gegenteil, zusätzlich zum Commit! Also habe ich

git add subdir/my-file 

Und sicher git status zeigte, dass es als eine „neue Datei“.

Dann habe ich git rebase --continue und alles ging gut, und die Rebase war ein Erfolg.

git push ging dann glatt anstatt über den gebrochenen Blob zu versagen.

Aber es gab immer noch ein Problem, weil git fsck noch versagt wurde:

$ git fsck --full 
Checking object directories: 100% (256/256), done. 
broken link from tree 27e8e7d5b94c1dad5410a8204089828a167a0eaf 
       to blob 95b6a826cadae849f4932a71d6735ab6ceb47cab 

Und git gc scheiterte auch, wenn ich ihm alles zu beschneiden gefragt. Also habe ich herausgefunden, die beste Vorgehensweise war, da ich zuvor erfolgreich gedrängt hatte, alles wieder in ein neues Repository zu klonen und von dort aus zu arbeiten.

Verwandte Themen