2009-10-02 17 views
37

Tôi nhận được lỗi này trong kho git của tôi:Làm thế nào để đối phó với điều này lỗi git

22:09:15 $ git status 
# On branch master 
error: Could not read 8124cc15c63be92d534e4cdfa33c38d54deee122 
error: unable to read tree object HEAD 
nothing to commit (working directory clean) 

Một tìm kiếm Google cho error: unable to read tree object HEAD không dẫn đến sự giúp đỡ nhiều, lỗi này có vẻ là rất hiếm. Tôi không chắc chắn làm thế nào để đối phó với nó. Nó có thể là một thất bại ổ cứng?

Sửa: Kết quả của git fsck như sau:

broken link from commit 607328dc80e4901a55b95c683d4fbf43e6df28bf 
       to tree 8124cc15c63be92d534e4cdfa33c38d54deee122 
missing tree 8124cc15c63be92d534e4cdfa33c38d54deee122 
dangling tree 56b5d4a5e429d251582ec927bca7ef1225510c41 
dangling tree 0259d2d38b18b6136bb6070fb41faf3624453cc6 
+0

Nghe có vẻ như tham nhũng của một số loại. Bạn đã thử 'git fsck' chưa? –

Trả lời

20

Trên một thông báo "vỡ liên kết", bạn có thể làm theo các GitFaq recommendations:

  • sao lưu tất cả các bạn nhà nước để bất cứ điều gì bạn làm là re-doable nếu bạn làm hỏng nhiều thứ hơn!
  • nổ bất kỳ tham nhũng gói-files
    • Xem "man git-unpack-objects", và đặc biệt là "-r" cờ.
      Ngoài ra, vui lòng nhận ra rằng nó chỉ mở các đối tượng chưa có sẵn, vì vậy bạn cần di chuyển tệp gói khỏi vị trí bình thường trước tiên (nếu không, git-unpack-objects sẽ tìm tất cả các đối tượng nằm trong gói tệp trong gói -file chính nó, và không giải nén bất cứ điều gì ở tất cả)
  • thay thế bất kỳ bị hỏng và/hoặc mất tích đối tượng
    • Đây là phần thử thách.
      Đôi khi (hy vọng thường xuyên!), Bạn có thể tìm thấy các đối tượng còn thiếu trong các bản sao khác của các kho lưu trữ.
      Vào những lúc khác, bạn có thể cần tìm cách tìm dữ liệu theo cách khác (ví dụ, có thể bản sao đã kiểm xuất của bạn có chứa nội dung tệp khi băm sẽ là đối tượng bị thiếu?).
  • đảm bảo mọi thứ đều hài lòng với "git fsck --full"
  • đóng gói lại tất cả mọi thứ để có được trở lại trạng thái hiệu quả một lần nữa

Ghi chú:

Cập nhật tháng 7 năm 2016 (7 năm laters), với Git 2.10 sớm được phát hành, bây giờ bạn có:

git fsck --name-objects 

Nó giúp đặt tên nguồn gốc của những liên kết bị hỏng

Xem "How to fix git error broken link from tree to tree?" để biết thêm.

+0

Chỉ cần lưu ý rằng GitFaq bạn đang liên kết bị hỏng. –

+0

@ChrisWilson: Cảm ơn bạn. Đã khôi phục liên kết. – VonC

+0

@VonC Nó bị hỏng một lần nữa. Đây là liên kết chính xác https://git.wiki.kernel.org/index.php/GitFaq – MikeKusold

4

Tôi đã gặp vấn đề tương tự. Sau nhiều lần kéo tóc, tôi phát hiện ra rằng nguyên nhân là do sự cho phép thay đổi đối với các tệp git của kho lưu trữ. Tôi đã giải quyết nó như sau:

$ cd .git 
$ chmod 755 * 

Xong!

+0

Đó là nguyên nhân trong trường hợp của tôi, nhưng mặc dù đề xuất của bạn sẽ ngăn chặn nó xảy ra, nó không sử dụng bây giờ vấn đề đã xảy ra - kho của tôi bị hỏng. Tôi đã sửa nó bằng cách đổi tên dự án, tái nhân bản từ nơi khác và tái tạo lại một số cam kết mà tôi đã mất bằng cách sao chép các tệp từ dự án đã đổi tên. Tôi đang sử dụng một LTS Ubuntu cũ hơn, vì vậy nó chỉ có git 1.5.4.3. – rjmunro

+3

không hoạt động cho tôi – jacob

+0

Thiên Chúa chúc lành cho bạn :-) –

11

Tôi vừa gặp sự cố tương tự. Các tham nhũng phát sinh khi máy tính xách tay của tôi đã làm một sức mạnh cứng-off trong một git pull. Tôi có một kho lưu trữ sao lưu từ xa. Đầu tiên tôi có một vài tệp đối tượng trong .git/objects/??/* có kích thước bằng không. Sau một bản sao lưu cp -a của kho, tôi đã làm điều này:

  • loại bỏ độ dài bằng không đối tượng
  • bản sao kho từ xa vào một kho lưu trữ ../fresh/
  • trong kho bị hỏng, tôi đã làm

    cat ../fresh/.git/objects/pack/pack-*.pack | git unpack-objects

Điều này sẽ làm đầy các đối tượng bị thiếu trong cơ sở dữ liệu đối tượng. Kho lưu trữ dường như được sao lưu ngay bây giờ.

+0

+1 điều này dường như hoạt động rất tốt trong tình huống của tôi - cảm ơn bạn đã đăng bài :) – cmhughes

+0

Weird, Git phàn nàn rằng một trong các gói của tôi đã bị hỏng. Tôi chỉ giải nén tập tin gói bị hỏng bằng cách sử dụng lệnh này, nó không phàn nàn trong khi giải nén về bất kỳ tham nhũng nào, và bây giờ git fsck lại hạnh phúc! – thenickdude

+0

Cảm ơn bạn! Điều này làm việc cho tôi. – galactica

1

Nếu bạn không có những thay đổi uncommited giải pháp đơn giản nhất là để xóa các chi nhánh địa phương: git branch -D [chi nhánh name]

và sau đó kiểm tra lại các chi nhánh từ xa: git checkout -b [chi nhánh name] origin/[tên chi nhánh]

2

Tôi gặp lỗi tương tự trong kho lưu trữ Git Homebrew cài đặt của mình. Thay vì khôi phục lại tất cả các đối tượng thiếu một, tôi thấy dễ dàng hơn khi chỉ cần xóa thư mục .git và tạo lại bằng cách sao chép lại từ Homebrew’s public repository. Đây là các bước của tôi:

  • Kiểm tra thông tin bạn có trong kho Git mà bạn sẽ không nhận được bằng cách sao chép lại. Đối với tôi, đó là các nhánh, stashes và remotes riêng tư.
    • Chuyển đổi stashes thành commit thực bằng cách tạo nhánh mới, áp dụng stash, và cam kết với cái gì đó như “[WIP]” trong tên để cho biết đó là stash.
    • Lưu các chi nhánh không có trên điều khiển từ xa công cộng bằng cách đẩy chúng vào điều khiển từ xa của riêng bạn. Đây có thể là ngã ba của kho lưu trữ trên GitHub, hoặc chỉ là một kho lưu trữ Git mới ở một vị trí khác trên máy của bạn.
    • Nếu bạn có nhiều hơn một điều khiển từ xa, hãy lưu đầu ra của git remote -v, bao gồm tên và URL của điều khiển từ xa của bạn, để bạn có thể thêm lại thủ công chúng sau này.
  • Xóa thư mục .git repoistory của bạn (hoặc đổi tên thành .git-broken và xóa sau). Trên dòng lệnh, đây là rm -rf .git.
  • Sao chép lại thư mục từ xa bằng git clone https://github.com/Homebrew/homebrew.git hoặc bất kỳ URI nào.
  • Điều này sẽ tạo một thư mục con mới homebrew được đặt tên theo kho lưu trữ. Bạn chỉ muốn thư mục .git từ đó; các tệp cục bộ của bạn đã ổn. Vì vậy, mv homebrew/.git .git, và sau đó xóa các homebrew thư mục.
  • Kho Git của bạn không có lỗi, vì bạn đã tạo lại từ đầu. Bây giờ, chỉ cần khôi phục bất kỳ thông tin nào bạn đã lưu trong bước đầu tiên.
    • Nếu bạn có thêm điều khiển từ xa, hãy thêm lại chúng với git remote add <name> <url>.
    • Nếu bạn sao lưu bất kỳ nhánh nào (hoặc các nhánh được chuyển thành nhánh) thành một kho lưu trữ từ xa, hãy kéo chúng từ kho lưu trữ đó vào kho lưu trữ cục bộ của bạn.
    • Nếu bạn muốn, bạn có thể chuyển đổi các nhánh gốc trở lại stashes bằng cách cuộn “[WIP]” cam kết với git reset HEAD^ và lưu lại thư mục làm việc lại với git stash save <custom-message>.

Nếu bạn chạy git fsck, bạn sẽ thấy không có lỗi:

$ git fsck 
Checking object directories: 100% (256/256), done. 
Checking objects: 100% (197135/197135), done. 
Checking connectivity: 197162, done. 
$ 

git stash list, git branch, và git remote -v sẽ hiển thị kết quả tương tự như trước.

0

tôi đã sửa lỗi bằng cách thực hiện thay đổi trong cùng thư mục/thư mục dự án và sau đó cố gắng thực hiện thay đổi mới, điều gì đã xảy ra là tôi nhận được thông báo lỗi 'đối tượng không hợp lệ 100644 e38e910ceb18b09f436f353c3a131bfe2caba130 cho' Book/alise_mathe/app/src/main/res/menu/drawermenu.xml ' thông điệp này giải quyết được vấn đề, tôi chỉ tái cấu trúc tệp drawermenu.xml bằng cách thay đổi tên tệp thành' drawer_menu.xml '. thêm các thay đổi đã cam kết và tất cả. (Android-studio)

Tôi hy vọng điều này sẽ giúp một số cách

0

tôi sửa lại lỗi này bằng cách xóa Capistrano 'repo' thư mục từ thư mục máy chủ từ xa của tôi. Tôi đã đi qua một số vấn đề được đề xuất khác và giải quyết rằng vấn đề không nằm trong dự án địa phương của tôi. Vấn đề dường như xảy ra khi Capistrano đang thực hiện kéo từ repo đến điều khiển từ xa. Đối với tôi, điều này có lẽ là do việc triển khai tạm dừng khiến các tham chiếu đối tượng/đối tượng bị hỏng. Máy chủ của tôi cũng vừa mới thực hiện một quá trình di chuyển máy chủ, có lẽ đã xảy ra sự cố trong quá trình này.

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