2013-01-01 37 views
7

Tôi có một tình huống với một đối tượng tham nhũng trong kho lưu trữ.Xóa git hỏng blob khỏi kho lưu trữ

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

Và tôi biết rằng Objet đây là một blob liên quan đến bằng một tuổi cam kết:

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

Tôi đã làm các classic steps to recover the blob from the FAQ nhưng có vẻ như không có bản sao khác của nó bất cứ nơi nào mà tôi có thể tìm thấy (Tôi đang làm việc một mình và đã không đẩy đến điều khiển từ xa trong một thời gian vì vậy nó không có) vì vậy tôi không thể phục hồi nó.

Blob này thực sự là phiên bản đầu tiên của một tệp đã được sửa đổi rất nhiều kể từ đó. Tôi tốt mất thông tin về phiên bản của tập tin đó. Vì vậy, tôi chỉ muốn xóa nó khỏi cam kết đang trỏ đến nó. Làm thế nào tôi có thể làm điều đó?

+0

Hãy thử xem một số giải pháp tại đây: http://stackoverflow.com/q/4254389/1031900 –

+0

Câu hỏi này nói về một cây bị hỏng, có một chút khác biệt. Không ai trong số những câu trả lời này có thể giúp tôi, thật đáng buồn. Tôi sẽ thử một vài thứ và sẽ đăng nó ở đây nếu chúng hoạt động. –

Trả lời

4

OK, cuối cùng tôi đã tự tìm ra.

Phiên bản ngắn: Tôi đã sửa đổi cam kết trỏ đến đốm màu bị hỏng để xóa nó khỏi lịch sử.

Phiên bản dài: Tôi nghĩ rằng vì tôi đã biết tệp là gì và chỉ muốn biến nó khỏi biến, sau đó tôi có thể sửa đổi cam kết cũ. Tôi đã không thực sự mong đợi nó làm việc, nhưng cuối cùng nó đã làm.

Tôi phải chỉ ra rằng tôi đã loại bỏ các đốm màu trong .git/đối tượng trong việc thử những điều trước đó, và nó có thể quan trọng vào lý do tại sao nó hoạt động.

Trước tiên, tôi phải biết nó là gì. Cho rằng tôi sử dụng lệnh

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

tôi thấy các cam kết được đặt tên 966a46 ....

Sau đó, tôi đã làm các bước để sửa đổi nó. Vì đó là một cam kết cũ, tôi đã sử dụng

git rebase -- interactive 966a46^ 

Trình chỉnh sửa của tôi có một dòng cho mỗi cam kết và tôi đã thay đổi "chọn" thành "chỉnh sửa" trước cam kết mà tôi muốn sửa đổi.

Lệnh git status cho tôi thấy rằng tập tin tôi muốn xóa đã được sửa đổi:

# 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 

tôi muốn loại bỏ nó khỏi các cam kết, vì vậy tôi đã làm rm subdir/my-file. git status sau đó hiển thị cho tôi:

#  deleted: subdir/my-file 

Điều này có vẻ đầy hứa hẹn. Vì vậy, tôi chỉ đơn giản là cam kết đã được sửa đổi cam kết và tiếp tục rebase:

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

Nhưng sau khi đã rebased một vài cam kết nó thất bại với lỗi này:

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

45c2315 là người đầu tiên cam kết, trong đó tập của tôi đã được sửa đổi sau khi đã được tạo. Vì nó không tìm thấy phiên bản trước của tập tin, nó chỉ thất bại.

git status cho tôi thấy, trong số những thứ khác:

# 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 

Tôi thực sự không chắc chắn những gì nó có nghĩa, nhưng điều này cam kết được cho là người đầu tiên trong đó các tập tin sẽ xuất hiện, sau khi sửa chữa. Vì vậy, tôi không muốn nó bị xóa, nhưng ngược lại, thêm vào cam kết! Vì vậy, tôi đã làm

git add subdir/my-file 

Và chắc chắn git status cho thấy đây là "tệp mới".

Sau đó, tôi đã thực hiện git rebase --continue và mọi thứ diễn ra tốt đẹp và việc rebase thành công.

git push diễn ra suôn sẻ thay vì thất bại về đốm màu bị vỡ.

Nhưng vẫn còn là một vấn đề, bởi vì git fsck vẫn thất bại:

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

git gc thất bại quá, khi tôi hỏi ông tỉa tất cả mọi thứ. Vì vậy, tôi đã tìm ra được hành động tốt nhất là, vì tôi đã đẩy thành công trước đó, để sao chép mọi thứ trở lại trong một kho lưu trữ mới và làm việc từ đó.

Các vấn đề liên quan