2010-12-12 23 views
18

Chỉ để cho vui, tôi đang cố gắng đặt khoảng 85GB các tệp nhị phân chủ yếu là 6MB vào git. Git chugs cùng một lúc nhưng luôn thất bại về nửa chừng với thông điệp "gây tử vong: nhầm lẫn bởi dữ liệu nguồn đối tượng không ổn định" theo sau là một SHA1. Bạn có biết tại sao? Có cách nào để sửa nó k?git nói "gây tử vong: bị nhầm lẫn bởi dữ liệu nguồn đối tượng không ổn định"

Trả lời

19

Hoặc

  • một hoặc nhiều tập tin đang được sửa đổi trong hoạt động của bạn, hoặc
  • một cái gì đó đang gây ra mâu thuẫn đọc (ví dụ thất bại phần cứng).

Phiên bản ngắn: Nhà phát triển Git không có ý định sử dụng nó trên các tệp dễ bay hơi.

Do bố trí * rằng Git sử dụng cho “đối tượng lỏng lẻo” và ngữ nghĩa hệ thống tập tin giới hạn mà nó giả **, Git phải biết byte đầu tiên (hai nhân vật hex) của tên đối tượng (SHA- 1) của một đối tượng mới trước khi nó có thể bắt đầu lưu trữ đối tượng đó.

* Thư mục objects/[0-9a-f][0-9a-f]/. Xem gitrepository-layout.
** Cụ thể, nó cần phải có khả năng đổi tên tệp "nguyên tử".Một số hệ thống tập tin (thường là hệ thống tập tin mạng, cụ thể là AFS, tôi tin) chỉ đảm bảo đổi tên nguyên tử khi nguồn và đích của một đổi tên nằm trong cùng một thư mục.

Hiện tại, Git có hai SHA-1 chuyển qua mỗi tệp mới. Pass đầu tiên được sử dụng để kiểm tra xem liệu Git đã biết về nội dung của tệp hay chưa (cho dù tên đối tượng SHA-1 của nó đã tồn tại trong kho lưu trữ đối tượng) chưa. Nếu đối tượng đã tồn tại, vượt qua lần thứ hai không được thực hiện.

Đối với nội dung mới (đối tượng không có trong kho đối tượng), tệp được đọc lần thứ hai trong khi nén và tính toán SHA-1 của dữ liệu đang được nén. Dữ liệu nén được ghi vào một tệp tạm thời chỉ được đổi tên thành tên đối tượng lỏng lẻo cuối cùng của nó nếu kiểm tra SHA-1 ban đầu ("đã được lưu trữ?") Khớp với SHA-1 sau (băm dữ liệu được nén và ghi) . Nếu các băm SHA-1 không khớp, thì Git sẽ hiển thị thông báo lỗi mà bạn đang thấy và hủy bỏ. Kiểm tra lỗi này đã được thêm vào trong 748af44c63 được phát hành lần đầu tiên trong Git 1.7.0.2.

+0

Chắc chắn rằng nó không dễ bay hơi, nhưng nó vẫn được * rất * hướng dẫn để đọc thêm về nội bộ của git. Tôi đoán bây giờ tôi phải đi và chắc chắn rằng đĩa của tôi không phải là thất bại. – jbfink

+10

chắc chắn sẽ tốt đẹp nếu git nói "gây tử vong: bị nhầm lẫn bởi dữ liệu nguồn đối tượng không ổn định" theo sau là SHA1 VÀ THÌ SAU THEO TẬP_TIN. Khá khó chịu mà nó không cho bạn biết những gì tập tin là dễ bay hơi ... Nếu nó đã làm tôi có thể hợp lý thêm nó hoặc thư mục của tôi .gitignore –

+4

vì vậy giải pháp cho điều này là gì? –

3

Hai lý thuyết:

  • Something được bằng văn bản cho những tập tin này trong khi bạn đang cố gắng đặt chúng vào git.

  • Bạn có một số loại lỗi đĩa/bộ nhớ gây hỏng dữ liệu.

4

Từ source, sha1 của blob được tính hai lần:

  • write_sha1_file_prepare
  • write_loose_object

cả gọi từ write_sha1_file (đó cũng là một con đường từ force_object_loose, nhưng nó là được sử dụng cho repacks).

Băm đầu tiên được sử dụng để kiểm tra xem đối tượng đã được biết hay chưa (mặc dù git cố gắng hết sức để đảm bảo rằng các tệp không được sửa đổi, touch hoặc như vậy sẽ làm mất dấu); thứ hai là băm của dữ liệu thực sự được đưa vào zlib để nén, sau đó được viết.

Hàm băm thứ hai có thể tốn kém hơn một chút do tính toán zlib, có thể giải thích tại sao hai băm được tính toán (mặc dù có vẻ là tai nạn lịch sử và tôi đoán chi phí hiệu suất khi thêm đối tượng mới tác động nhiều hơn so với thắng CPU khi phát hiện các thay đổi giả). Ai đó có thể thêm một dự phòng để logic kiểm tra tồn tại write_changed_sha1 được làm lại với sha1 mới, để các tệp không ổn định đó cũng có thể được thêm vào. Điều đó sẽ hữu ích cho các bản sao lưu, khi một vài tệp đang được thêm vào đang mở.

15

Có khả năng khác, ngay cả khi từ xa. Đó sẽ là một tệp thực sự lớn (ví dụ: 3 hoặc nhiều hơn gb) đơn giản, git không thể xử lý nó. Chúng tôi thấy rằng lỗi khi cố gắng tạo một kho lưu trữ trong cấu trúc có các tệp lớn

+0

Chỉ có điều này xảy ra với một số tập tin đăng nhập nhiều gigabyte mà snuck vào một cây làm việc git. – fche

+0

Các tệp lớn (nhưng ổn định) chắc chắn gây ra lỗi này. Thực tế là thông báo lỗi là gây hiểu lầm và Git không cho bạn biết trước về kích thước là một thiếu sót, ít nhất là bây giờ, của Git. Tôi đã thử git-annex, một cách đầy hứa hẹn để xử lý các tệp lớn, nhưng cho đến nay vẫn chưa thể làm cho nó hoạt động trên OS/X. –

0

Nó có thể xảy ra nếu bạn cố gắng git svn clone hoặc git svn tìm nạp kho lưu trữ trên hệ thống tệp btrfs, có thể liên quan đến điều kiện chủng tộc hoặc nguyên tử bên trong btrfs bò tính năng.

Ví dụ:

git svn --authors-file=authors.map clone http://svn.example.com/svn/repo repo 

hoặc

cd repo; git svn --authors-file=../authors.map fetch 

Tôi tìm thấy một workaround bằng cách thiết lập bạn căn cứ thư mục làm việc mà không copy-on-write:

chattr +C . 

Sau đó, bạn cần phải lặp tất cả dữ liệu của bạn (ví dụ):

cp -fr repo repo.new; rm -fr repo; mv -f repo.new repo 

cp authors.map authors.map.new; mv -f authors.map.new authors.map 

Sau đó, nó không nên thất bại (và chạy nhanh hơn).

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