2009-10-09 35 views
9

kho git làm việc của tôi bị hỏng, nó mất đi đúng hướng để tất cả các file trong nó, ví dụ:Phục hồi kho git vỡ

 
$ git log 
fatal: bad default revision 'HEAD' 
 
$ git status 
... told me that all the files are new 

Tuy nhiên thư mục .git có chứa đối tượng của tôi.

 
$ du -sh .git 
34M .git 
 
$ git count-objects 
4151 objects, 32692 kilobytes 
 
$ git --version 
git version 1.6.0.4 

Điều cuối cùng tôi nhớ làm trước khi nó trục trặc khi đã tạo ra (clone --mirror) một kho lưu trữ sao lưu tại một máy chủ NFS gắn. Tuy nhiên kho lưu trữ sao lưu nhân bản bị hỏng theo cùng một cách.

Tôi làm cách nào để khôi phục kho lưu trữ của mình?

+0

Có nhánh 'master' nào trong kho lưu trữ của bạn không? Ngoài ra, bạn có nhận được kết quả khác với 'git log --all' không? –

+0

Không, 'git branch -a' không nói gì cả. – Eyoka

Trả lời

8

Chắc chắn phải có thứ gì đó bên cạnh bản sao, nhưng tôi biết việc nhớ những thứ đó là khó khăn đến mức nào. Điều đầu tiên bạn muốn làm là xem xét .git/refs và xem liệu có điều gì hợp lệ trong đó không (tôi không quá lạc quan vì bạn nói rằng dường như không có bất kỳ chi nhánh nào, nhưng nó đáng giá một shot). Nếu có bất kỳ thông tin hợp lệ nào tồn tại, bạn có thể nhận được một số thông tin từ git-reflog.

Tiếp theo, tôi sẽ bắt đầu xem git-fsck. Mục đích chính của nó là để xác minh kết nối và tính hợp lệ của các đối tượng trong cơ sở dữ liệu. Tùy thuộc vào những gì chính xác đã xảy ra với repo của bạn, bạn có thể cần --unreachable hoặc --lost-found. Hy vọng rằng các đối tượng là nguyên vẹn, vì vậy tất cả các bạn cần làm là tìm một số băm cam kết lủng lẳng để kiểm tra và tái tạo các chi nhánh tại.

+0

Cảm ơn. Tôi đã sửa kho lưu trữ theo cách thủ công. Hóa ra là các nhánh (các tệp trong .git/refs/heads) bị thiếu, nhưng các đối tượng vẫn còn nguyên vẹn. Tôi đã có thể nhận được băm cam kết của đầu mỗi nhánh từ .git/logs/HEAD và sử dụng chúng để tạo lại các tệp chi nhánh. Tôi không biết lệnh git-fsck. Tuy nhiên tôi vẫn tò mò làm thế nào điều này xảy ra, rõ ràng là tôi không làm

git branch -d
. Tôi không biết nhiều lệnh git, những người duy nhất tôi nhớ đang làm là
git reset
git remote rm ...
Eyoka

1

Bạn có thể kiểm tra thủ công, nhưng điều đó đòi hỏi một số kiến ​​thức về định dạng của kho lưu trữ.

Nếu không nhìn vào kho lưu trữ thì khó có thể biết được điều gì đang xảy ra, nhưng có thể một số tệp đã bị hỏng.

Chạy git fsck và nó sẽ cho biết liệu kho lưu trữ của bạn vẫn hợp lệ.

Đăng kết quả của git fsck run và điều đó sẽ giúp chúng tôi trợ giúp bạn.

1

Hãy thử kiểm tra xem mỗi tệp của bạn có trong .git/được sở hữu bởi người dùng hiện tại hay không.

Tôi có cùng một vấn đề, khi nhận ra tôi đã thực hiện một số cam kết với người dùng root và đối tượng đã tạo (dưới .git/objects) trong đó có lỗi gốc, lỗi trigering khi chạy git với tư cách người dùng thông thường.

Lệnh này đã giải quyết được vấn đề:

sudo chown jb:jb .git/ -R * 
1

Tôi có vấn đề này chỉ là bây giờ sau khi sử dụng GitHub của tôi (PC) bị rơi. Chi nhánh của tôi biến mất khi sử dụng git branch và nó vẫn khiến tôi phải thực hiện cam kết ban đầu của mình. Tôi đã giải quyết nó bằng cách định vị chi nhánh của tôi theo số .git/refs/heads/ và đổi tên nó từ mybranch.lock thành chỉ mybranch (tháo khóa).

+0

Câu trả lời này đã giúp ích trong trường hợp của tôi. Tôi đã sử dụng GitHub cho Windows và đột nhiên nó xử lý mọi tệp trong kho lưu trữ dưới dạng tệp mới. git log đã trả về "fatal: bad default revision 'HEAD'". git fsck trả lại một loạt các cam kết lơ lửng. Tôi chỉ cần đổi tên file master.lock thành master –

0

Tôi gặp vấn đề này sau khi nhà phát triển thực hiện $ git init bên trong trình quản lý chính của một repo tập trung.

Nếu bạn đang làm việc với kho lưu trữ không có thư mục làm việc, hãy kiểm tra thư mục .git; xóa điều này sẽ khắc phục được sự cố.

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