Cứu nguy Repository: Làm chủ git fsck để khôi phục code và sửa lỗi dữ liệu

Git tutorial - IT technology blog
Git tutorial - IT technology blog

Khi nào bạn cần đến git fsck?

Mất điện đột ngột khi đang gõ lệnh? Ổ cứng dở chứng khiến Git báo lỗi error: inflate: data stream error hay corrupt loose object? Những lúc này, phản xạ tự nhiên của nhiều người là git clone lại từ đầu cho nhanh.

Tuy nhiên, nếu những thay đổi quan trọng chưa kịp push lên server thì sao? Đó là lúc git fsck (File System Check) phát huy tác dụng. Công cụ này đóng vai trò như một thanh tra, giúp kiểm tra tính toàn vẹn của database Git. Nó giúp bạn phát hiện các object bị hỏng và tìm lại những commit “mồ côi” không còn xuất hiện trong git log.

Tôi từng chứng kiến một đồng nghiệp khôi phục lại toàn bộ 2 ngày làm việc chỉ nhờ lệnh này. Khi đó, ổ cứng server bị lỗi sector khiến một vài object quan trọng bị hỏng ngay trước giờ demo sản phẩm. Nhờ git fsck, chúng tôi đã cô lập được vùng lỗi và cứu vãn tình thế kịp thời.

Ba khái niệm cốt lõi về tính toàn vẹn trong Git

Git lưu trữ dữ liệu dưới dạng các Objects (blob, tree, commit, tag) và định danh chúng bằng mã hash SHA-1. Để dùng lệnh hiệu quả, bạn cần phân biệt được ba trạng thái sau:

  • Unreachable Objects: Những object vẫn nằm trong database nhưng không có branch hay tag nào trỏ tới.
  • Dangling Objects: Đây là hệ quả của việc git commit --amend hoặc rebase. Những commit cũ không biến mất ngay mà tạm thời trở thành các “commit treo”.
  • Corrupt Objects: Các file trong thư mục .git/objects bị biến đổi nội dung do lỗi phần cứng, dẫn đến sai lệch mã hash.

Thực hành rà soát và khắc phục lỗi

1. Kiểm tra tổng thể Repository

Hãy bắt đầu bằng lệnh cơ bản nhất để đánh giá sức khỏe repo:

git fsck

Nếu kết quả trống, xin chúc mừng, repo của bạn hoàn toàn sạch sẽ. Nếu xuất hiện danh sách dangling commit, bạn cũng không cần quá lo lắng. Đây thường chỉ là dấu vết của những lần sửa commit hoặc chuyển nhánh thông thường.

Để kiểm tra gắt gao hơn, hãy sử dụng:

git fsck --full --strict

Flag --strict buộc Git phải soi xét kỹ từng chi tiết nhỏ nhất về định dạng. Lệnh này cực kỳ hữu ích khi bạn nghi ngờ có sự cố đồng bộ dữ liệu giữa các thành viên trong team.

2. Tìm kiếm và khôi phục Commit đã mất

Giả sử bạn lỡ tay xóa một branch chưa kịp merge. Lúc này, git log sẽ hoàn toàn mất dấu nó. Đừng hoảng loạn, commit đó vẫn tồn tại trong đống dangling objects.

Sử dụng lệnh sau để lọc ra các commit không thể truy cập:

git fsck --unreachable | grep commit

Sau khi có danh sách mã hash, hãy dùng git show <commit-hash> để kiểm tra nội dung bên trong. Khi đã xác định đúng commit cần tìm, bạn chỉ cần tạo một branch mới trỏ vào mã hash đó:

git branch recovery-branch <commit-hash>

Mẹo nhỏ: Nếu danh sách quá dài, hãy dùng git fsck --lost-found. Git sẽ tự động phân loại các object mồ côi vào thư mục .git/lost-found/, giúp bạn duyệt file dễ dàng hơn qua trình quản lý file thông thường.

3. Xử lý khi gặp Corrupt Object (Lỗi nặng)

Nếu nhận thông báo sha1 mismatch, đây là dấu hiệu hỏng hóc vật lý. Hãy thử các bước sơ cứu sau:

  1. Kiểm tra reflog: Chạy git reflog để tìm điểm phục hồi gần nhất trước khi xảy ra lỗi.
  2. Thay thế object hỏng: Nếu xác định được blob bị hỏng, bạn có thể xóa file lỗi trong .git/objects. Sau đó, hãy thử git checkout lại file đó từ một máy của thành viên khác trong team.
  3. Tận dụng Remote: Cách an toàn nhất là clone repo sang thư mục mới. Sau đó, copy đè thư mục .git sang folder cũ (nhớ sao lưu folder cũ trước khi thực hiện).

Kinh nghiệm thực chiến: Phòng bệnh hơn chữa bệnh

Trong một team 8 người, tôi luôn yêu cầu quy tắc “Push sớm, push thường xuyên”. git fsck rất hữu ích nhưng nó chỉ cứu được những gì bạn đã từng git add hoặc git commit. Những file đang ở trạng thái untracked sẽ vĩnh viễn biến mất nếu ổ cứng gặp sự cố.

Ngoài ra, hãy định kỳ chạy git gc (Garbage Collection). Lệnh này không chỉ nén repo cho nhẹ hơn mà còn ngầm chạy git fsck để dọn dẹp các object thừa. Lưu ý rằng sau khi git gc dọn dẹp (thường sau 14 ngày), các dangling commit sẽ bị xóa vĩnh viễn để giải phóng bộ nhớ.

Kết luận

Dù không phải lệnh dùng hàng ngày, git fsck là kỹ năng sinh tồn mà mọi lập trình viên chuyên nghiệp cần biết. Hiểu cách Git quản lý object giúp bạn tự tin xử lý mọi tình huống mất dữ liệu. Lần tới nếu thấy Git báo lỗi lạ, hãy bình tĩnh dùng fsck trước khi nghĩ đến việc xóa repo. Chúc bạn bảo vệ mã nguồn an toàn!

Share: