Я відчуваю себе дитиною в кабінеті директора, пояснюючи, що собака їв мою домашню роботу в ніч до того, як це відбулося, але я дивлюсь на якусь божевільну помилку втрати даних в обличчя, і я не можу зрозуміти, як це сталося. Я хотів би знати, як git міг їсти моє сховище ціле! Я багато разів прокладав git через винищувач, і він ніколи не моргнув. Я використав це для того, щоб розділити репо з 20 Gig Subversion на 27 git repos і фільтрувати розгалужену туш для них, щоб розплутати безлад, і він ніколи не втратив байт на мені. Рефлог завжди є, щоб відпасти. Цього разу килим пропав!
З моєї точки зору, все, що я робив, є запущеним, git pull
і це заполонило все моє місцеве сховище. Я не маю на увазі, що це "переплутало перевірену версію" чи "гілку, на якій я був", або щось подібне. Я маю на увазі, що вся справа пішла .
Ось знімок екрана мого терміналу при інциденті:
Дозвольте мені пройти вас через це. Мій командний рядок включає дані про поточну репортажну програму git (використовуючи vcs_info реалізацію prezto), щоб ви могли побачити, коли 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» гілці, і перевірив майстра. Все йде нормально. Ви побачите в запиті перед моєю наступною командою, що вона успішно перемикає гілки:
» 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 або системному журналі. Нічого навіть віддалено не має значення.
- Немає вказівки несправності накопичувача або файлової системи (LVM + LUKS + EXT4 все виглядає нормально). У втраченому + знайденому немає нічого.
- Я більше нічого не бігав. Нічого в історії я не показую вище, і жоден інший термінал не використовувався протягом цього часу. Немає
rm
плаваючих команд навколо, які могли б виконатись у неправильному КЗД тощо. - Переміщення іншого git repo в іншому каталозі не показує видимих аномалій виконання
git pull
s.
Що ще я повинен шукати тут?
.git
не існує. Нічого не робить - те, що раніше було кореневою каталогом git, взагалі нічого не містить.