Tất cả các cam kết và các tệp mà chúng tham chiếu sẽ được lưu trữ dưới dạng các đối tượng trong objects
thư mục. Git tạo ra chúng dưới dạng chỉ đọc, vì vậy tất cả chúng vẫn nên có mặt.
Để khôi phục, tôi khuyên bạn nên tạo một kho lưu trữ mới, trống và sao chép nội dung của thư mục kho lưu trữ bị hỏng của bạn vào kho lưu trữ objects
mới. Điều đó sẽ đưa bạn đến một điểm mà git ít nhất sẽ nhận ra rằng đó là một kho lưu trữ và nó sẽ có tất cả các đối tượng của bạn. Làm việc với một bản sao cũng sẽ giúp tránh gây ra nhiều thiệt hại hơn trong khi cố gắng sửa chữa mọi thứ.
Các lệnh Shell để tạo kho lưu trữ tạm thời và sao chép qua các đối tượng:
git init /tmp/recovery
cd /tmp/recovery
cp -r /path/to/broken/repo/.git/objects .git
Khi đã xong, bạn có thể sử dụng git fsck
để lấy danh sách các đối tượng không được tham chiếu bởi bất cứ thứ gì. Điều này sẽ bao gồm tất cả các người đứng đầu chi nhánh, nhưng nó cũng sẽ bao gồm bất kỳ cam kết nào đã bị lỗi thời bởi git commit
--amend
hoặc bằng cách nổi loạn.
Vì bạn vẫn có thư mục bản ghi có khả năng là một trợ giúp thậm chí còn lớn hơn. Cần có một logs/refs/heads/<branch>
tập tin cho mỗi chi nhánh mà bạn đã có. Cột thứ hai của dòng cuối cùng sẽ chứa ID của cam kết nằm ở đầu chi nhánh đó khi việc xóa được thực hiện. Cũng cần logs/HEAD
có cùng thông tin về vị trí của CHÍNH, nhưng trừ khi bạn đang làm việc với một ĐẦU tách rời, có lẽ tốt hơn là chỉ cần khôi phục các nhánh và sau đó kiểm tra một nhánh bình thường.
Đối với mỗi nhánh mà bạn muốn khôi phục, bạn có thể chạy:
git branch <name> <commit_id>
Khi bạn đã khôi phục các nhánh, bạn có thể sao chép tệp cấu hình và bạn sẽ khá gần với vị trí của bản cam kết mới nhất.