2011-08-29 34 views
23

Chúng tôi đang sử dụng Gerrit cho kho lưu trữ Git của chúng tôi. Trong một dự án đã hoạt động trong vài tháng, chúng tôi đột nhiên không thể đẩy bất kỳ thay đổi nào. Khi chúng tôi thực hiện git push chúng ta thấy được lỗi sau:Làm cách nào để khôi phục kho lưu trữ Git của tôi cho lỗi "thiếu cây"?

error: unpack failed: error Missing tree 14d62f0ed4385e3f68f226ac133fa9932a9c65c9

Thi git fsck --full sản lượng:

dangling tree 2701c92fb6eab1826482f6bcc9598413e651a92a 
dangling blob c505b3b12cfacd1e26dec8dc559820a30fc20c27 
dangling blob 8907f94b5b4ec881e1b86d50681795e368c167ff 
dangling blob 4938d9fc34c6e2f92c68872bfec6e070b2b3a9c2 
dangling blob 8a5c8b8d35484ea1470e2d8e6c482fcb97b23d0f 
dangling commit 3072d3314e20bf6c6998e1c02986d83019d3e1df 
dangling tree 5377d7f7111d340854c3ee0946667c202227e603 
dangling tree c3783e9ab540457924ceb9f9fb5ea1c2b97472b1 
dangling blob 8b92d1765038e4ec5e721f98a2aabb305a7f9819 
dangling tree 38a03153f0f18ca15846e9bd4983a86800a43a94 
dangling commit 8db2d6ae5364174bebe13720a359ddb2e62d4c9d 

Tất cả các nhà phát triển của chúng tôi đang gặp những lỗi tương tự khi họ cố gắng để đẩy. Cho đến nay, chúng tôi đã thử khởi tạo lại repo gerrit (git init --bare ...) và đẩy nó lên. Chúng tôi cũng đã thử tạo một dự án gerrit mới với một repo riêng biệt. Cuối cùng, chúng tôi tiếp tục gặp lỗi tương tự.

Có ai có bất kỳ thông tin chi tiết nào về nguyên nhân hoặc cách khôi phục không?

Trả lời

7

Sao lưu ... sao lưu lại ngay giây phút này trước khi bạn thử bất cứ điều gì.

Bây giờ, điều đó nghe có vẻ không may. Nó cũng là một sự xấu hổ mà nó không có vẻ như bạn có một sao lưu thường xuyên để đi đến. Mặc dù vậy, có một tin vui là: Tôi đặt cược các nhà phát triển của bạn có tệp này, mặc dù nó có thể nằm trong một tệp gói. Hãy thử những điều sau đây trong thư mục .git của người khác. Lưu ý rằng git sử dụng hai ký tự đầu tiên của hàm băm cho tên thư mục.

find . -name d62f0ed4385e3f68f226ac133fa9932a9c65c9 

Nếu đó xuất hiện, sao chép tập tin này vào đường dẫn tương đối như nhau trên máy chủ của bạn, và cuộc sống nên chuyển sang độc đáo. Nếu không, hãy thử cách này:

find . -name \*.idx -exec cat {} \; | git show-index | grep 14d62f0ed4385e3f68f226ac133fa9932a9c65c9 

Điều đó sẽ không hiển thị cho bạn tệp gói nào (bạn có thể nhanh chóng viết hoặc làm theo cách thủ công) nhưng sẽ cho bạn biết. Tìm tệp gói phù hợp và mở rộng nó ...

git unpack-objects $FILE 

Từ đó, sao chép tệp vào cùng một đường dẫn tương đối trên máy chủ của bạn. Nếu điều đó không giải quyết được, cần phải có thêm công việc. Trao đổi kho lưu trữ đủ cập nhật của nhà phát triển có thể khắc phục mọi thứ. Bạn cũng có thể muốn khám phá https://git.wiki.kernel.org/index.php/GitFaq#How_to_fix_a_broken_repository.3F hoặc đăng nhận xét cập nhật và chờ tôi quay lại với điều này.

+0

Cảm ơn thông tin, nó đã giúp tôi khá nhiều. Tôi đã có thể tìm thấy tập tin idx đúng, nhưng giải nén tập tin gói đã không phục hồi bất cứ điều gì. Đó cũng là câu chuyện tương tự cho một số nhà phát triển khác của chúng tôi. Cuối cùng, tôi đã hết thời gian, vì vậy chúng tôi đã giải quyết vấn đề bằng cách khởi tạo một repo mới và giữ một cái cũ xung quanh cho lịch sử. –

+0

Chúng tôi có một vấn đề tương tự, nơi chúng tôi không thể đẩy các nhánh nhất định do lỗi cây bị thiếu. Chúng tôi đã đặt đối tượng còn thiếu và sao chép nó vào kho lưu trữ từ xa nhưng vấn đề vẫn tồn tại. Bất kì manh mối nào? –

3

Thử một số git pull --rebase.

Tôi đã lưu khác biệt (git show > ~/mychanges.txt, đã lấy thông điệp cam kết ở đầu tệp). Đã kiểm tra chi nhánh mới (git checkout -b newbranch) đã áp dụng các thay đổi (git apply ~/mychanges.txt) và sau đó đã thực hiện git pull --rebase. Sau đó, mọi thứ đã hoạt động.

+1

Cảm ơn bạn đã cứu ngày của tôi! – simonso

0

Về mặt kỹ thuật câu trả lời này hơi muộn, nhưng những gì làm việc cho tôi là tạo bản vá cho changeset mà tôi đã cố gắng đẩy, kéo lưu trữ vào vị trí đĩa khác, Áp dụng bản vá, được đề xuất và đẩy.

0

Giải pháp nhanh là Tìm nạp -> Rebase-> Cam kết và sau đó nhấn.

3

Nếu không được vào chi nhánh tổng thể, bạn có thể chỉ đơn giản là xóa các chi nhánh từ xa bằng cách:

git push --delete origin <branch_name> 

Và sau đó đẩy chi nhánh của bạn trở lại để điều khiển từ xa:

git push -u origin <branch_name> 
11

Tôi nhận được lỗi này cùng trên git tra tấn của tôi. Cuối cùng tôi đã có được nguyên nhân gốc rễ của lỗi này.

Các bước gây ra lỗi này;

  • Tạo chi nhánh mới trên đầu.
  • Do một số thay đổi về chi nhánh mới
  • Ai đó cũng làm cho những thay đổi về chi nhánh đầu
  • Cố gắng đẩy chi nhánh của bạn

Lỗi này sẽ xảy ra nếu một chi nhánh địa phương được tạo ra và không bị đẩy đến một số sửa đổi ara được thực hiện trong chi nhánh đầu. Đây là một điều bình thường, vì chi nhánh đầu từ xa không biết gì về chi nhánh địa phương của bạn cho đến khi một hành động đẩy.

Để giải quyết lỗi này, hãy chuyển nhánh đầu có tác vụ kéo hoàn toàn. Sau đó chuyển nhánh của bạn và thử push.

+0

Wow đó là nguyên nhân hoàn toàn không rõ ràng. Giải pháp này làm việc cho tôi! –

29

Sử dụng git push --no-thin thay vì git push.

Từ Git tài liệu:

A thin transfer significantly reduces the amount of sent data when the sender and receiver share many of the same objects in common. The default is --thin.

+3

Nếu nhánh của bạn có nhiều cam kết, bạn có thể muốn sử dụng tùy chọn này. Nó hoạt động tốt! – Riverside

1

Thử nâng cấp phiên bản của git, chúng tôi thấy vấn đề với 1.9.0

3

Khi chúng ta có được điều này, tôi gần như lúc nào cũng có thể sửa chữa nó với một gc git:

git gc --aggressive --prune=now 

sao lưu git repo của bạn trước!

1

Điều này thường xảy ra khi thời gian cam kết và đẩy khác nhau và cuối cùng tạo ra sự không phù hợp giữa cả hai cây. Với một chi nhánh từ xa thượng nguồn và chi nhánh địa phương foo

Thứ nhất vứt bỏ tất cả những thay đổi không bị giam bằng

git reset --hard foo 

Sau đó theo dõi các chi nhánh từ xa sử dụng

git branch --set-upstream-to=upstream/foo 

Và cuối cùng

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