Я чувствую себя ребенком в кабинете директора, объясняя, что собака съела мою домашнюю работу накануне ее появления, но я смотрю на сумасшедшую ошибку потери данных на лице и не могу понять, как это произошло. Я хотел бы знать, как мерзавец мог съесть мое хранилище целиком! Я много раз вставлял мерзавца, и он никогда не моргал. Я использовал его, чтобы разделить репозиторий 20 Gig Subversion на 27 репозиториев git и отфильтровать их, чтобы распутать беспорядок, и это никогда не потеряло меня. Переполнения всегда есть, чтобы отступить. На этот раз ковер исчез!
С моей точки зрения, все, что я сделал, - это запустил git pull
и уничтожил весь мой локальный репозиторий. Я не имею в виду, что это «испортило проверенную версию» или «ветку, на которой я был» или что-то в этом роде. Я имею в виду, что все это ушло .
Вот скриншот моего терминала в инциденте:
Позволь мне провести тебя через это. Моя командная строка содержит данные о текущем git-репо (используя реализацию vcs_info prezto), чтобы вы могли видеть, когда git-репо исчезло. Первая команда достаточно нормальная:
» 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-репо. Обратите внимание, что 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, ничего. Пустой.
Мой локальный мерзавец находится на версии 2.0.2. Вот пара моментов из моего git config, которые могут иметь отношение к выяснению того, что произошло:
[branch]
autosetuprebase = always
rebase = preserve
[pull]
rebase = true
[rebase]
autosquash = true
autostash = true
[alias]
co = checkout
Например, я git pull
установил всегда делать ребазирование вместо слияния, чтобы часть вывода выше была нормальной.
Я могу восстановить данные. Я не думаю, что были какие-то другие мерзавцы, кроме неважных тайников, которые не были отправлены в другие репозитории, но я хотел бы знать, что произошло .
Я проверил:
- Сообщения в dmesg или системный журнал. Ничего, даже отдаленно не актуального.
- Нет признаков сбоя диска или файловой системы (LVM + LUKS + EXT4 все выглядит нормально). Там нет ничего в потерянном + найдено.
- Я больше ничего не запускал. В истории нет ничего, что я не показываю выше, и никакие другие терминалы не использовались в течение этого времени. Нет
rm
команд, плавающих вокруг, которые могли бы выполняться в неправильном CWD и т. Д. - Выглядывание в другом git-репо в другом каталоге не показывает явной аномалии выполнения
git pull
s.
Что еще я должен искать здесь?
.git
не существует. Ничего не значит - то, что раньше было корневым каталогом git, вообще ничего не имеет.