2012-04-07 3 views
4

Ich habe ein beschädigtes loses Objekt.Zurück in die Geschichte zu einer unbeschädigten Version?

Ich habe versucht, checkout, revert, rebase und vielleicht ein paar andere Dinge zu einem ursprünglichen Commit zu gehen. I git fsck In jedem Fall lief und hatte immer noch das gleiche Problem:

> git fsck 
error: corrupt loose object '25a196217ebb6e341909205575f491022eafc4d9' 
fatal: loose object 25a196217ebb6e341909205575f491022eafc4d9 (stored in .git/objects/25/a196217ebb6e341909205575f491022eafc4d9) is corrupt 

gibt es eine Möglichkeit der beschädigten Objekte loszuwerden ohne .git einfach zu löschen? Ich habe kein weiteres Backup, so dass ich das beschädigte Objekt nicht ersetzen kann.

Es ist eine schmale Frage, die git "error: corrupt loose object" after moving a directory

Update aus diesem entstand (1):

> git gc 
Counting objects: 747, done. 
Delta compression using up to 8 threads. 
error: corrupt loose object '25a196217ebb6e341909205575f491022eafc4d9' 
fatal: loose object 25a196217ebb6e341909205575f491022eafc4d9 (stored in .git/objects/25/a196217ebb6e341909205575f491022eafc4d9) is corrupt 
error: failed to run repack 

Update (2): dies nicht funktioniert entweder Remove file from git repository (history)

Aktualisierung (3): Klonen d funktioniert nicht:

> git clone ../dynamicsCode_good/ . 
Cloning into .... 
done. 
error: corrupt loose object '25a196217ebb6e341909205575f491022eafc4d9' 
fatal: loose object 25a196217ebb6e341909205575f491022eafc4d9 (stored in .git/objects/25/a196217ebb6e341909205575f491022eafc4d9) is corrupt 

die. Verzeichnis ist leer

update (4): Entfernen eines beschädigten Objekts.

> git --version 
git version 1.7.5.4 


> rm -f .git/objects/25/a196217ebb6e341909205575f491022eafc4d9 
13:42:57 ~/Dropbox/work/dev/dynamicsCode_torek 
> git fsck --full 
missing blob 25a196217ebb6e341909205575f491022eafc4d9 
dangling tree 64a970c878fef7deeeb4ce2ffc5e6234a72894ad 
dangling tree 528e6c121fb8e56097462b2ebb9ec4de66388ce2 

erster (erster) Kommentar. Dieser Kommentar enthält nicht einmal die beschädigte Datei.

> git log |tail -5 
commit 150ceebafb9c20769386cc7ffba07f6e6565fae6 
Author: Kirill ...gmail.com> 
Date: Tue Sep 27 22:51:15 2011 -0400 

    state takes input as input 
checkout: 

> git checkout -b 150ceebafb9c20769386cc7ffba07f6e6565fae6 
Switched to a new branch '150ceebafb9c20769386cc7ffba07f6e6565fae6' 

> git gc 
Counting objects: 783, done. 
error: unable to find 25a196217ebb6e341909205575f491022eafc4d9 
Compressing objects: 100% (776/776), done. 
fatal: unable to read 25a196217ebb6e341909205575f491022eafc4d9 
error: failed to run repack 
> git fsck --full 
broken link from tree 4668817140320ad2e04aa946d95dec2c3885d97b 
       to blob 25a196217ebb6e341909205575f491022eafc4d9 
missing blob 25a196217ebb6e341909205575f491022eafc4d9 
dangling tree 64a970c878fef7deeeb4ce2ffc5e6234a72894ad 
dangling tree 528e6c121fb8e56097462b2ebb9ec4de66388ce2 

Ich habe versucht, auch im .git/objects/pack/ Verzeichnis das einzige Objekt, das Auspacken. hat nicht geholfen.

ich geklont auch diesen Zustand in ein neues Verzeichnis:

> git gc 
Counting objects: 662, done. 
error: unable to find 25a196217ebb6e341909205575f491022eafc4d9 
Compressing objects: 100% (656/656), done. 
fatal: unable to read 25a196217ebb6e341909205575f491022eafc4d9 
error: failed to run repack 
14:40:34 ~/Dropbox/work/dev/dynamicsCode_torek_commit_clone 
> git fsck 
broken link from tree b5ab6b287804d5069a3c8648ace38d9d9feac1a5 
       to blob 25a196217ebb6e341909205575f491022eafc4d9 
dangling commit dad8edc620248d3911b7b1c0a99608a64e0288a3 
missing blob 25a196217ebb6e341909205575f491022eafc4d9 
dangling tree 64a970c878fef7deeeb4ce2ffc5e6234a72894ad 
dangling commit ae2b2a9edb744d9e91aa78891c849d5a0040ea94 
dangling commit 32ed79bd4ac70b118d046cb6093a4710562e95ba 
dangling commit 7e45ef0c6ffc46401b1f82bcbf0f7e843abf9e31 
dangling tree 528e6c121fb8e56097462b2ebb9ec4de66388ce2 
14:40:40 ~/Dropbox/work/dev/dynamicsCode_torek_commit_clone 
> git branch 
* 150ceebafb9c20769386cc7ffba07f6e6565fae6 

auch nicht geholfen hat.

Die beschädigte Datei ist tags von Ctags. Ich brauche es nicht. Es ist merkwürdig, dass ich git ohne diese Datei nicht wiederherstellen kann. Am wichtigsten ist, dass ich aus all meinen Untersuchungen weder sehe, wie es gemacht werden kann, noch warum es nicht möglich ist.

Update (5): Kasse ohne

> git checkout 150ceebafb9c20769386cc7ffba07f6e6565fae6 
Note: checking out '150ceebafb9c20769386cc7ffba07f6e6565fae6'. 

You are in 'detached HEAD' state. You can look around, make experimental 
changes and commit them, and you can discard any commits you make in this 
state without impacting any branches by performing another checkout. 

If you want to create a new branch to retain commits you create, you may 
do so (now or later) by using -b with the checkout command again. Example: 

    git checkout -b new_branch_name 

HEAD is now at 150ceeb... state takes input as input 
16:41:40 ~/Dropbox/work/dev/dynamicsCode_torek_commit 
> git fsck --full 
broken link from tree 4668817140320ad2e04aa946d95dec2c3885d97b 
       to blob 25a196217ebb6e341909205575f491022eafc4d9 
missing blob 25a196217ebb6e341909205575f491022eafc4d9 
dangling tree 64a970c878fef7deeeb4ce2ffc5e6234a72894ad 
dangling tree 528e6c121fb8e56097462b2ebb9ec4de66388ce2 
+1

Ist 'git gc' sauber? – Andy

+0

Nein, ich aktualisiert in Update (1) –

+0

Sie könnten versuchen, dieses Repository zu klonen. Klonen sollte nur die "notwendigen" Objekte in ein neues Repo aufnehmen, so lange dieses lose Objekt wirklich "unnötig" für Ihren Klon ist, haben Sie möglicherweise einen korruptionsfreien Repo in Ihrem Klon. –

Antwort

2

Verzweigung Wenn Sie das beschädigte Objekt manuell entfernen, git wird in der Regel können Sie auf alles andere zu bekommen. Ich beschädigt absichtlich ein git blob (nur ein paar schlechtes Bytes in der Front gezwungen) und bekam den folgenden:

$ git fsck 
fatal: object bd1b260b0ef92d1a219e1183953fa1ac7cdb4cad is corrupted 
$ git gc 
Counting objects: 23, done. 
error: unable to unpack bd1b260b0ef92d1a219e1183953fa1ac7cdb4cad header 
error: inflateEnd: failed 
Delta compression using up to 2 threads. 
Compressing objects: 100% (12/12), done. 
fatal: object bd1b260b0ef92d1a219e1183953fa1ac7cdb4cad is corrupted 
error: failed to run repack 
$ git fsck --full 
fatal: object bd1b260b0ef92d1a219e1183953fa1ac7cdb4cad is corrupted 
$ rm -f .git/objects/bd/1b260b0ef92d1a219e1183953fa1ac7cdb4cad 
$ git fsck --full 
broken link from tree a3070cb66fd169e1443867a8bb137a44103c9f24 
       to blob bd1b260b0ef92d1a219e1183953fa1ac7cdb4cad 
missing blob bd1b260b0ef92d1a219e1183953fa1ac7cdb4cad 
$ git cat-file -p 2418b6ba8fd0289933c9351260a272b8e410867f 
tree a3070cb66fd169e1443867a8bb137a44103c9f24 
parent 8d945134b0cead535d66af29c8eb4228b5dc3763 
author [redacted] 1333789753 -0600 
committer [redacted] 1333789753 -0600 

test corrupted object 
$ git checkout 2418b6ba8fd0289933c9351260a272b8e410867f 
error: git checkout-index: unable to read sha1 file of morefile (bd1b260b0ef92d1a219e1183953fa1ac7cdb4cad) 
D morefile 
Note: checking out '2418b6ba8fd0289933c9351260a272b8e410867f'. 

You are in 'detached HEAD' state. ... 

Hinweis, irgendwo auf dem Weg es den Zweig master zu einem frühen „gut“ begehen erneut darauf (nicht die unmittelbar vorhergehende, und ich habe keine Ahnung, warum), so müssen Sie dann Ihren Commit-Verlauf usw. reparieren. Aber alles war da, bis auf die fehlende Datei "morefile", deren Blob ich beschädigte.(I wiederhergestellt es aus einer Sicherungskopie ich im Voraus gemacht und war sogar in der Lage, die Datei wieder zu bekommen, mit git checkout -- morefile. Man konnte die beschädigte blob irgendwo und sieht mv wenn Sie einige Ihrer Daten daraus wiederherstellen können.)

Ich würde sicherlich das kaputte Git Repo zuerst, Just In Case. :-)

+0

unser Git fsck ist ein bisschen anders. Ich habe das Gleiche getan wie du. Und versuchte, zu klonen. hat nicht funktioniert. Siehe Aktualisierung (4). In jedem Fall schätze ich eine ausführliche Antwort von Ihnen. –

+0

BTW die magische Zahl oben (2418b ...) kam vom Scrollen zurück, um zu sehen, was es war, bevor ich das eine Blob-Objekt zerschmetterte. Wenn du sagst, dass du nicht funktioniert hast, meinst du "git checkout ", erhältst du keinen funktionierenden Baum? Ich habe das auf meinem Laptop getestet, wo ich 1.7.0.3 installiert habe. – torek

+0

1) Ja, das habe ich mir gedacht. Ich habe meinen ersten Kommentar benutzt (siehe 'git log | tail -n5' in update (4)). der Kommentar hat nicht einmal die beschädigte Datei; also ist es ein guter Kommentar. 2) Ich bin mir nicht sicher, ob es den Baum bevölkert oder nicht, aber "fit fsck" gibt immer noch einen Fehler, siehe update (5). –