2015-05-20 2 views
2

НАЧАЛЬНИКА фиксацию объект моего .git репо был потерян из-за машины аварии:вручную извлекая reflog когда мерзавец reflog терпит неудачу

$ git rev-parse HEAD 
1f411c372caab4767638df0b47be5e2f576cb582 

$ git reflog 
error: object file .git/objects/1f/411c372caab4767638df0b47be5e2f576cb582 is empty 
fatal: loose object 1f411c372caab4767638df0b47be5e2f576cb582 (stored in .git/objects/1f/411c372caab4767638df0b47be5e2f576cb582) is corrupt 

Оказывается, есть только несколько файлов, которые повреждены, а потому, HEAD commit является одним из них, я не могу найти хэш предыдущего коммита.

Однако мое понимание рефлога - это история всех изменений в HEAD, даже если они недоступны, поэтому я ожидаю, что там будет место в .git, где я могу найти предыдущий хеш, m удивлен reflog не работает.

Есть ли способ сбросить reflog вручную и, возможно, восстановить это легко?

Мне все равно, если я потеряю только последнюю фиксацию (или даже последние несколько коммитов), потому что мой рабочий каталог в порядке. Но я не хочу терять все последние 4 дня с тех пор, как я подтолкнулся к своему серверу.

Если я могу найти правильный алгоритм SHA, я могу восстановить просто с

git checkout -B recovery 

и идти на моем веселом пути.

Спасибо!

P.S. Да, я мог бы обрабатывать свой рабочий каталог как просто сквош за последние 4 дня работы, но предпочел бы, если возможно, захватить историю.

ОБНОВЛЕНИЕ. FYI: Как я на самом деле восстановить, используя ответ:

tail .git/logs/HEAD 
8030ad73461b75e3ce575d5896a9511f6036e45d 1f411c372caab4767638df0b47be5e2f576cb582 REDACTED 1432014000 -0700 commit: REDACTED 

git branch -f recovery 8030ad73461b75e3ce575d5896a9511f6036e45d 
echo "ref: refs/heads/recovery" > .git/HEAD 

ответ

1

Посмотрите на нижней части файла .git/logs/HEAD, который отслеживает все изменения в HEAD.

(И изменения ветви отслеживаются в файлах в .git/logs/refs/heads/.)

Смежные вопросы