2012-01-31 35 views
7

Tại nơi làm việc, chúng ta phải đối phó với một kho lưu trữ git rất lớn (90Go). Sau khi đã cố gắng tinh chỉnh một số thứ trên bản sao cục bộ của tôi (tôi có lỗi với tệp gói, đã cố gắng giải nén tệp), tôi có thể đã xóa một số tệp đối tượng. Ví dụ:Git: lấy một đối tượng cụ thể từ một từ xa

> git gc

error: Could not read af9ed8[:snip:]

fatal: bad tree object af9ed8[:snip:]

error: failed to run repack

Làm thế nào tôi có thể lấy một đối tượng cụ thể (trong trường hợp đó, một với af9ed8 băm ...) từ một kho lưu trữ từ xa?

+1

Tôi biết điều này không trả lời câu hỏi của bạn, nhưng bạn có thể xem xét đề xuất chia nhỏ tài khoản đó! Nếu nó lớn đến mức bây giờ, nó sẽ trở nên to hơn, và wow, phải mất nhiều thời gian để sao chép. – Cascabel

+0

Điều gì sẽ xảy ra nếu bạn chạy 'git fetch origin'? Liệu nó có cố gắng tìm nạp quá nhiều đối tượng không? – Cascabel

+0

@Jefromi Về cơ bản thì không thể nói được ^^. Các thủ tục chỉ là đồng bản sao nguyên repo. Tôi rất muốn làm cho nó bị chia cắt, nhưng đó sẽ là một công việc địa ngục, làm tê liệt cả nhóm và không phải những gì mà những kẻ phụ trách sẽ làm. Tôi không chịu trách nhiệm cho nó (tôi là kinda mới ...). Họ chỉ được sử dụng để đối phó với nó: thở dài: ... –

Trả lời

4

Nếu bạn có quyền truy cập hệ thống tập tin với hay bất kỳ kho nguyên vẹn khác từ xa chứa đối tượng này, bạn sẽ có thể đến đó và chạy:

git cat-file tree af9ed8 > 9ed8... 

Lưu ý rằng điều này chỉ đòi hỏi phải truy cập chỉ đọc để repo (bạn có thể viết tập tin ở nơi khác) vì vậy nó phải rất an toàn, và bạn thậm chí có thể làm điều đó như một người dùng không có quyền ghi vào hệ thống tập tin. Sau đó bạn có thể chuyển/sao chép nó vào nơi thích hợp trong repo của bạn:

cp path/to/9ed8... .git/objects/af/9ed8... 

đối tượng Loose được lưu trữ trong thư mục với hai chữ số đầu tiên của băm; tên tệp là phần còn lại của băm.

Chỉnh sửa: Nếu đối tượng bị lỏng trên đầu từ xa, bạn cũng có thể trực tiếp sao chép nó ra khỏi .git/objects, nhưng nếu nó được đóng gói, bạn phải giải nén nó với git unpack-objects và tôi tưởng tượng các gói trong repo đó cực lớn. Cách tốt nhất để làm điều đó sẽ là sao chép packfile vào repo bị hỏng của bạn, xóa bất kỳ đối tượng bị hỏng, và sau đó sử dụng git unpack-objects < packfile, mà sẽ không giải nén bất kỳ đối tượng nào đã tồn tại.

Tôi không chắc chắn cách thực hiện thông qua các lệnh từ xa thông thường; ngay cả mức độ thấp hơn git fetch-pack vẫn hoạt động ở cấp độ ref, tìm nạp một gói với các cam kết cần thiết để hoàn thành ref. Tôi nghi ngờ rằng bạn có thể làm điều gì đó lén lút như xóa tất cả các đối tượng cam kết tham chiếu đến cây đó (git fsck có thể giúp bạn tìm thấy chúng). Tôi đã thực sự hy vọng bạn có thể tạo một thẻ trỏ đến đối tượng đó, đẩy nó vào điều khiển từ xa, sau đó thử lấy thẻ từ xa (coaxing nó vào tìm nạp đối tượng) nhưng có vẻ như Git khá cẩn thận không cho phép bạn thực hiện hoặc thao tác một thẻ trỏ đến một đối tượng không tồn tại.

+0

Nó cho tôi biết khi tôi cố gắng cắt tỉa một lần nữa rằng đối tượng af9ed8 ... của repo cục bộ của tôi bị hỏng. –

+0

Prune? Ý anh là 'git gc'? Có lẽ bạn nên bắt đầu chỉ với 'git fsck'. Và nó nói rằng đối tượng bị hỏng sau khi bạn đã sao chép một đối tượng nguyên vẹn từ một repo khác? (Tôi không chắc mình có muốn chạy 'git gc' trên một repo lớn hay không. Điều đó sẽ mất một khoảng thời gian dài.) – Cascabel

+0

Vâng git gc mang lại cho tôi câu trả lời tương tự. Tôi nghĩ rằng tôi đang từ bỏ ... –

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