2012-09-24 27 views
17

Ngay trước khi nhận lỗi này tôi đã làm như sau:sửa chữa một đối tượng lỏng lẻo tham nhũng như một cam kết trong git

[email protected]:~/file/path$ git add * 
[email protected]:~/file/path$ git push 
^C 
[email protected]:~/file/path$ git commit -m "my commitmesg" 

(Tôi hoảng sợ vì tôi quên để thêm một cam kết trước khi đẩy, vì vậy tôi Cntrl + c'ed . nó

Bây giờ, tôi nhận được lỗi sau từ git fsck -full:.

error: inflate: data stream error (incorrect header check) 
error: corrupt loose object '5cdeb9c3a1fe164cb4d2779d1e0d9d9f4ef18c6a' 
fatal: loose object 5cdeb9c3a1fe164cb4d2779d1e0d9d9f4ef18c6a (stored in .git/objects/5c/deb9c3a1fe164cb4d2779d1e0d9d9f4ef18c6a) 

git mèo-file -t 5cdeb9c3a1fe164cb4d2779d1e0d9d9f4ef18c6a trả về đối tượng này là một cam kết

Sau khi tìm kiếm, tôi đã tìm thấy cách sửa lỗi này nếu đối tượng là blob nhưng không phải nếu đó là cam kết.

Trả lời

16

Trước tiên, tạo bản sao lưu kho lưu trữ hiện tại của bạn. cp -r hoặc gì đó. Bằng cách đó, nếu nỗ lực của bạn để sửa chữa kho lưu trữ của bạn vít nó lên tồi tệ hơn, bạn có thể khôi phục lại.

Điều đơn giản nhất để thử là thay thế tệp đối tượng bị hỏng đó bằng một tệp đang hoạt động. Nếu bạn có một bản sao lưu kho lưu trữ của bạn, hãy sử dụng nó. Nếu không, hãy thực hiện git clone từ kho lưu trữ từ xa của bạn để nhận một bản sao mới và sao chép .git/objects/5c/deb9c3a1fe164cb4d2779d1e0d9d9f4ef18c6a vào tài khoản hiện có bị hỏng. Xem nếu mà sửa chữa nó.

+0

Tôi có repo của tôi trên github nhưng họ không có những thay đổi này mà tôi đã cố gắng cam kết (vào thời điểm này, tôi không quan tâm nếu tôi mất chúng mãi mãi, nhưng muốn có được chúng nếu có thể). Tôi nhân bản từ repo gh của tôi nhưng nó không có bất kỳ đối tượng nào trong thư mục .git của nó. :/ –

+7

Các đối tượng được đóng gói. Giải nén chúng thành các tệp riêng lẻ với 'git unpack-objects .git/objects/pack/*. Pack'. – Schwern

+2

Nếu lệnh git unpack-objects không làm gì cả "** không có gì sẽ được giải nén nếu ** bạn sử dụng lệnh này trên một tệp gói tồn tại trong kho lưu trữ đích." ([git docs] (http://git-scm.com/docs/git-unpack-objects)). Để giải nén các đối tượng, chỉ cần tạo một repo mới bằng cách sử dụng 'git init' và chạy lệnh để giải nén tệp gói (từ kho lưu trữ nhân bản) khỏi kho lưu trữ mà bạn vừa tạo. – svallory

7

cảm ơn bạn đã trả lời lại. Tôi chạy nó trong repo nhân bản mới và trả lại rằng nó giải nén 100% các đối tượng tuy nhiên chúng không có trong .git/objects/pack của repo đó.

Vì vậy, thay vào đó và thử một cái gì đó sáng nay hoạt động. 1. nhân bản kho lưu trữ github của tôi vào một thư mục riêng biệt mới. 2. sao chép các tập tin thay đổi cục bộ (mà tôi muốn cam kết ban đầu) vào kho lưu trữ nhân bản mới của tôi và sau đó đẩy chúng vào github. 3. nuked kho lưu trữ cục bộ cũ của tôi và 4. nhân bản nó một lần nữa vào cùng một đường dẫn tập tin mà tôi đã có kho lưu trữ cũ của tôi.

+0

Mặc dù phản hồi này là phản hồi cũ, nó hoạt động trong trường hợp của tôi, nơi tôi đã có một đối tượng bị hỏng và không thể thu gọn ký tự (thông qua GitGUI). Trước khi tôi sao chép qua các tệp cục bộ, tôi đã thêm một bước - gọi nó là (1a) - nén các đối tượng qua GitGUI. Quá trình này đã thành công (cuối cùng!), Sau đó tôi cập nhật với các đối tượng địa phương mà ban đầu tôi muốn cam kết và cam kết thành công. Cảm ơn! – NWdev

0

câu trả lời đơn giản cho câu hỏi này cho bất cứ ai phải đối mặt với vấn đề này: các git clone lệnh là việc sửa chữa, nếu có một repo từ xa sau đó sao chép nó vào thư mục địa phương (sau khi xóa các repo địa phương bị hỏng), trong trường hợp bạn không có repo từ xa sau đó cố gắng đẩy repo tham nhũng để github và sau đó sao chép nó từ đó, tôi nghĩ rằng các đối tượng bị hỏng sẽ không được đẩy và nó sẽ sửa vấn đề

3

Rất giống với câu trả lời của Schwerm, nhưng tôi phải bắt đầu repo mới để giải nén các tệp .pack:

git clone <repo-uri> my_repo.fresh_clone 
mkdir my_repo.newly_unpacked 
cd !$ 
git init 
for pack_file in ../my_repo.fresh_clone/.git/pack/*.pack; do 
    git unpack-objects < $pack_file 
done 

Sau đó, tôi sao chép qua các tập tin từ my_repo.newly_unpacked/.git/objects/<xx>/<sha1> như được chỉ ra bởi các thông báo lỗi. Tôi đã bị bắt vì một số hoạt động, chẳng hạn như git checkout tiết lộ nhiều đối tượng bị thiếu hơn một đơn giản git status, vì vậy tốt nhất để giữ các thư mục khôi phục xung quanh một chút trước khi làm sạch chúng.

0

Tôi đã có một vấn đề tương tự khi hệ thống bị rơi trước khi thực hiện một cam kết. May mắn thay tất cả những gì tôi phải làm là sao chép toàn bộ repo một lần nữa vào một thư mục mới và loại bỏ thư mục cũ.

Mới được sao chép bản sao không có tệp .git/objects/# num/# hash bị hỏng.

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