Я щойно пережив це - моя машина розбилася під час написання репортажу Git, і вона стала пошкодженою. Я це зафіксував так.
Я почав з перегляду того, скільки комітетів я не відсунув до віддаленого репо, таким чином:
gitk &
Якщо ви не використовуєте цей інструмент, він дуже зручний - доступний у всіх операційних системах, наскільки я знаю. Це вказувало на те, що в моєму пульті не було двох комітів. Тому я натиснув на етикетку із зазначенням останнього віддаленого фіксування (як правило, це буде /remotes/origin/master
), щоб отримати хеш (хеш - 40 символів завдовжки, але для стислості я тут використовую 10 - це зазвичай працює все одно).
Ось:
14c0fcc9b3
Потім натискаю на наступний фіксатор (тобто перший, у якому віддалений не має) і отримую хеш там:
04d44c3298
Потім я використовую обидві для того, щоб зробити виправлення для цього зобов'язання:
git diff 14c0fcc9b3 04d44c3298 > 1.patch
Потім я робив так само і з іншими відсутніми комітами, тобто я використовував хеш комітів раніше і хеш комітету:
git diff 04d44c3298 fc1d4b0df7 > 2.patch
Потім я перейшов до нового каталогу, клонував репо з дистанційного:
git clone git@github.com:username/repo.git
Потім я перемістив файли виправлень у нову папку та застосував їх та вчинив їх своїми точними повідомленнями про фіксацію (їх можна вставити з вікна git log
або gitk
):
patch -p1 < 1.patch
git commit
patch -p1 < 2.patch
git commit
Це відновило для мене речі (і зауважте, що, ймовірно, є більш швидкий спосіб зробити це для великої кількості комітів). Однак я хотів побачити, чи можна дерево в зіпсованому репо відремонтувати, і відповідь - це можна. З відремонтованим репо, доступним, як описано вище, запустіть цю команду в розбитій папці:
git fsck
У вас вийде щось подібне:
error: object file .git/objects/ca/539ed815fefdbbbfae6e8d0c0b3dbbe093390d is empty
error: unable to find ca539ed815fefdbbbfae6e8d0c0b3dbbe093390d
error: sha1 mismatch ca539ed815fefdbbbfae6e8d0c0b3dbbe093390d
Щоб виконати ремонт, я зробив би це у розбитій папці:
rm .git/objects/ca/539ed815fefdbbbfae6e8d0c0b3dbbe093390d
cp ../good-repo/.git/objects/ca/539ed815fefdbbbfae6e8d0c0b3dbbe093390d .git/objects/ca/539ed815fefdbbbfae6e8d0c0b3dbbe093390d
тобто видаліть пошкоджений файл і замініть його хорошим. Можливо, вам доведеться це зробити кілька разів. Нарешті з’явиться точка, в якій можна працювати fsck
без помилок. У звіті, ймовірно, будуть рядки "звисання" та "звисання", вони є наслідком ваших знижок та змін у цій папці. Сміттєзбиральник їх буде своєчасно вивозити.
Таким чином, (принаймні в моєму випадку) зіпсоване дерево не означає, що втрачені нечисті втрати.