git pull
是怎麼吃掉我的作業的?
我感覺就像校長辦公室裡的一個孩子,解釋說狗在到期前一天晚上吃了我的作業,但我正盯著一些瘋狂的數據失去錯誤,我不知道它是怎麼發生的。我想知道 git 如何吃掉我的整個儲存庫!我已經多次將 git 通過絞擰機,它從未眨眼。我用它將 20 Gig Subversion 儲存庫拆分為 27 個 git 儲存庫,並從它們中過濾分支 foo 以解開混亂,它從來沒有在我身上失去一個字節。reflog 總是可以依靠的。這次地毯不見了!
從我的角度來看,我所做的只是執行
git pull
,它破壞了我的整個本地儲存庫。我並不是說它“弄亂了簽出的版本”或“我所在的分支”或類似的東西。我的意思是整個事情都過去了。這是事件發生時我的終端的螢幕截圖:
讓我帶你了解一下。我的命令提示符包含有關目前 git repo 的數據(使用 prezto 的 vcs_info 實現),因此您可以看到 git repo 何時消失。第一個命令很正常:
» caleb » jaguar » ~/p/w/incil.info » ◼ zend ★ » ❯❯❯ git co master Switched to branch 'master' Your branch is up-to-date with 'origin/master'.
在那裡你可以看到我在’zend’分支上,並簽出了master。到現在為止還挺好。您將在我的下一個命令之前的提示中看到它成功切換了分支:
» 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
就這樣它消失了。如果超過 10 秒,則在下一個提示之前輸出已用時間標記。除了通知它正在倒帶重放之外,Git 沒有給出任何輸出。沒有跡象表明它完成了。
下一個提示不包含關於我們在哪個分支或 git 狀態的數據。
沒有註意到它失敗了,我不經意地嘗試執行另一個 git 命令,結果卻被告知我不在 git repo 中。注意 PWD 沒有改變:
» 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).
之後環顧四周,發現我在一個完全空的目錄中。沒有。沒有’.git’目錄,什麼都沒有。空的。
我的本地 git 版本為 2.0.2。以下是我的 git 配置中的一些花絮,可能與弄清發生的事情有關:
[branch] autosetuprebase = always rebase = preserve [pull] rebase = true [rebase] autosquash = true autostash = true [alias] co = checkout
例如,我已
git pull
設置為始終執行變基而不是合併,因此上面的部分輸出是正常的。我可以恢復數據。我認為除了一些未推送到其他儲存庫的不重要的儲存之外,沒有任何 git 對象,但我想知道發生了什麼。
我已經檢查過:
- dmesg 或 systemd 日誌中的消息。甚至沒有什麼相關的。
- 沒有跡象表明驅動器或文件系統出現故障(LVM + LUKS + EXT4 看起來都正常)。lost+found 中沒有任何內容。
- 我沒有執行其他任何東西。我沒有在上面顯示的歷史記錄中沒有任何內容,並且在此期間沒有使用其他終端。沒有
rm
浮動的命令可能在錯誤的 CWD 等中執行。- 在另一個目錄中查看另一個 git repo 顯示執行
git pull
s 沒有明顯異常。我還應該在這裡尋找什麼?
是的,
git
吃了我的作業。所有的。我
dd
在事件發生後製作了這張磁碟的圖像,後來又搞砸了。從系統日誌中重構一系列事件,我推斷發生的事情是這樣的:
pacman -Syu
在此事件發生前幾天已發出系統更新命令 ( )。- 長時間的網路中斷意味著它不得不重新嘗試下載包。由於缺乏網際網路而感到沮喪,我讓系統進入睡眠狀態並上床睡覺。
- 幾天后系統被喚醒,它再次開始查找和下載包。
- 就在我碰巧弄亂這個儲存庫之前的某個時間,包下載完成了。
- 系統glibc安裝
git checkout
在git pull
.git
二進製文件在啟動後和完成之前被替換git pull
。- 第七天,
git
從所有的勞苦中休息。並刪除了世界,所以其他人也不得不休息。我不知道究竟是什麼競爭條件導致了這種情況發生,但是在操作中間換出二進製文件肯定不是很好,也不是可測試/可重複的條件。通常執行二進製文件的副本儲存在記憶體中,但
git
很奇怪,而且它重新生成自身版本的方式我肯定會導致這種混亂。顯然它應該死而不是摧毀一切,但這就是發生的事情。