Tôi cảm thấy như một đứa trẻ trong văn phòng hiệu trưởng giải thích rằng con chó đã ăn bài tập về nhà của tôi vào đêm trước khi đến hạn, nhưng tôi đang nhìn chằm chằm vào một số lỗi mất dữ liệu điên rồ ở mặt và tôi không thể hiểu được nó đã xảy ra như thế nào. Tôi muốn biết làm thế nào git có thể ăn toàn bộ kho lưu trữ của tôi! Tôi đã đặt git qua máy vắt nhiều lần và nó không bao giờ chớp mắt. Tôi đã sử dụng nó để chia một repo 20 Gig Subversion thành 27 git repos và lọc phân nhánh foo ra khỏi chúng để gỡ rối mớ hỗn độn và nó không bao giờ mất một byte đối với tôi. Các reflog luôn luôn ở đó để trở lại. Lần này thảm đã biến mất!
Từ quan điểm của tôi, tất cả những gì tôi đã làm là chạy git pull
và nó đã thu thập toàn bộ kho lưu trữ cục bộ của tôi. Tôi không có nghĩa là nó "làm hỏng phiên bản đã kiểm tra" hoặc "chi nhánh tôi đã ở" hoặc bất cứ điều gì tương tự. Tôi có nghĩa là toàn bộ điều đã biến mất .
Đây là ảnh chụp màn hình thiết bị đầu cuối của tôi tại sự cố:
Hãy để tôi dẫn bạn qua đó. Dấu nhắc lệnh của tôi bao gồm dữ liệu về repo git hiện tại (sử dụng triển khai vcs_info của prezto) để bạn có thể thấy khi git repo biến mất. Lệnh đầu tiên là đủ bình thường:
» caleb » jaguar » ~/p/w/incil.info » ◼ zend ★ »
❯❯❯ git co master
Switched to branch 'master'
Your branch is up-to-date with 'origin/master'.
Ở đó bạn có thể thấy tôi đã ở chi nhánh 'zend' và kiểm tra chủ. Càng xa càng tốt. Bạn sẽ thấy trong lời nhắc trước lệnh tiếp theo của tôi rằng nó đã chuyển thành công các nhánh:
» caleb » jaguar » ~/p/w/incil.info » ◼ master ★ »
❯❯❯ git pull
remote: Counting objects: 37, done.
remote: Compressing objects: 100% (37/37), done.
remote: Total 37 (delta 25), reused 0 (delta 0)
Unpacking objects: 100% (37/37), done.
From gitlab.alerque.com:ipk/incil.info
+ 7412a21...eca4d26 master -> origin/master (forced update)
f03fa5d..c8ea00b devel -> origin/devel
+ 2af282c...009b8ec verse-spinner -> origin/verse-spinner (forced update)
First, rewinding head to replay your work on top of it...
>>> elapsed time 11s
Và cứ như thế nó biến mất. Dấu thời gian đã trôi qua xuất hiện trước dấu nhắc tiếp theo nếu hơn 10 giây đã trôi qua. Git đã không đưa ra bất kỳ đầu ra nào ngoài thông báo rằng nó đang tua lại để phát lại. Không có dấu hiệu cho thấy nó đã hoàn thành.
Dấu nhắc tiếp theo bao gồm không có dữ liệu về chi nhánh chúng tôi đang ở hoặc trạng thái của git.
Không nhận thấy nó đã thất bại, tôi đã cố gắng chạy một lệnh git khác chỉ để nói rằng tôi không ở trong một repo git. Lưu ý NKT không thay đổi:
» caleb » jaguar » ~/p/w/incil.info »
❯❯❯ git fetch --all
fatal: Not a git repository (or any parent up to mount point /home)
Stopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set).
Sau đó, một cái nhìn xung quanh cho thấy tôi đang ở trong một thư mục hoàn toàn trống rỗng. Không có gì. Không có thư mục '.git', không có gì. Trống.
Git địa phương của tôi là phiên bản 2.0.2. Dưới đây là một vài thông tin từ cấu hình git của tôi có thể liên quan đến việc tìm hiểu điều gì đã xảy ra:
[branch]
autosetuprebase = always
rebase = preserve
[pull]
rebase = true
[rebase]
autosquash = true
autostash = true
[alias]
co = checkout
Ví dụ, tôi đã git pull
đặt luôn luôn thực hiện một rebase thay vì hợp nhất, do đó một phần của đầu ra ở trên là bình thường.
Tôi có thể khôi phục dữ liệu. Tôi không nghĩ rằng có bất kỳ đối tượng git nào khác ngoài một số stash không quan trọng đã bị đẩy sang các repos khác, nhưng tôi muốn biết điều gì đã xảy ra .
Tôi đã kiểm tra:
- Tin nhắn trong dmesg hoặc tạp chí systemd. Thậm chí không có gì liên quan từ xa.
- Không có dấu hiệu của lỗi ổ đĩa hoặc hệ thống tệp (LVM + LUKS + EXT4 đều trông bình thường). Không có gì trong mất + tìm thấy.
- Tôi đã không chạy bất cứ điều gì khác. Không có gì trong lịch sử tôi không hiển thị ở trên và không có thiết bị đầu cuối nào khác được sử dụng trong thời gian này. Không có
rm
lệnh nào trôi nổi xung quanh có thể đã thực thi trong CWD sai, v.v. - Chọc vào một repo git khác trong một thư mục khác cho thấy không có bất thường rõ ràng thực thi
git pull
s.
Những gì khác tôi nên tìm kiếm ở đây?
.git
không tồn tại. Không có gì làm những gì từng là thư mục gốc git không có gì trong đó cả.