Git

git pull 是怎麼吃掉我的作業的?

  • December 5, 2018

我感覺就像校長辦公室裡的一個孩子,解釋說狗在到期前一天晚上吃了我的作業,但我正盯著一些瘋狂的數據失去錯誤,我不知道它是怎麼發生的。我想知道 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 pulls 沒有明顯異常。

我還應該在這裡尋找什麼?

是的,git吃了我的作業。所有的。

dd在事件發生後製作了這張磁碟的圖像,後來又搞砸了。從系統日誌中重構一系列事件,我推斷發生的事情是這樣的:

  1. pacman -Syu在此事件發生前幾天已發出系統更新命令 ( )。
  2. 長時間的網路中斷意味著它不得不重新嘗試下載包。由於缺乏網際網路而感到沮喪,我讓系統進入睡眠狀態並上床睡覺。
  3. 幾天后系統被喚醒,它再次開始查找和下載包。
  4. 就在我碰巧弄亂這個儲存庫之前的某個時間,包下載完成了。
  5. 系統glibc安裝git checkoutgit pull.
  6. git二進製文件在啟動後和完成之前被替換git pull
  7. 第七天,git從所有的勞苦中休息。並刪除了世界,所以其他人也不得不休息。

我不知道究竟是什麼競爭條件導致了這種情況發生,但是在操作中間換出二進製文件肯定不是很好,也不是可測試/可重複的條件。通常執行二進製文件的副本儲存在記憶體中,但git很奇怪,而且它重新生成自身版本的方式我肯定會導致這種混亂。顯然它應該死而不是摧毀一切,但這就是發生的事情。

引用自:https://unix.stackexchange.com/questions/146299