Làm thế nào để khôi phục kho git bị hỏng / bị xóa một phần


7

Tôi vô tình chạy một rm -rthư mục .git của tôi. May mắn rmdừng lại khi nó đến một tệp được bảo vệ chống ghi, nhưng tôi vẫn bị mất một số thứ trong .git của mình.

Tập tin tôi vẫn có:

FETCH_HEAD
ORIG_HEAD
config
gitk.cache
logs/
objects/

Các tập tin tôi đã mất:

HEAD
description
hooks/
index
info/
packed-refs
refs/

Từ những gì tôi có thể nói, điều duy nhất tôi đã mất mà tôi không thể sao chép lại là những thay đổi trong khu vực tổ chức và giới thiệu của tôi. Tôi đã sẵn sàng để mất các thay đổi dàn dựng của mình nhưng tôi thực sự cần phải phục hồi CHÍNH và các chi nhánh của mình. Có cách nào để làm việc này không? Nói, bằng cách tìm các cam kết không có con, kiểm tra chúng để xem chúng là gì và tạo ra các nhánh cho chúng? Hiện tại git thậm chí không nhận ra kho lưu trữ của tôi là kho lưu trữ nữa.

Câu trả lời:


11

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 objectsthư 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ữ objectsmớ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 --amendhoặ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/HEADcó 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.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.