Сховище Git порушено після смерті комп'ютера


94

Мій комп’ютер загинув, і тепер одне з моїх сховищ git зламано. Коли я намагаюся перевірити майстра, він говорить мені:

warning: ignoring broken ref refs/heads/master.
error: Your local changes to the following files would be overwritten by checkout:
        com.vainolo.jdraw2d.releng.p2/pom.xml
Please, commit your changes or stash them before you can switch branches.
Aborting

Коли я виконую, git stashя отримую:

fatal: bad revision 'HEAD'
fatal: bad revision 'HEAD'
fatal: Needed a single revision
You do not have the initial commit yet

Отже ... що я можу зробити?

Результат оновленняgit reflog :

fatal: bad default revision 'HEAD'

Не дуже перспективно ... Результат git fsck:

error: Invalid HEAD
Checking object directories: 100% (256/256), done.
error: unable to unpack 59551f96b4e87a1c14293c19eb548ce6fa1f196f header
error: inflateEnd: stream consistency error (no message)
fatal: loose object 59551f96b4e87a1c14293c19eb548ce6fa1f196f (stored in .git/objects/59/551f96b4e87a1c14293c19eb548ce6fa1f196f) is corrupt

Чи можете ви перевірити, чи .git/refs/heads/masterіснує, і чи є його вміст дійсним хешем коміту вашого сховища (ви можете це перевірити, наприклад, використовуючи git show <hash>)?
тикати

Я знаю, що це очевидно, але все ж запитую - чи є у вас віддалені репозиторії того самого репозиторію git?
Tuxdude

@poke вміст .git/refs/heads/master/- це купа^@
vainolo

Так, @Tuxdude, але не оновлено до моїх останніх змін
vainolo,

1
Що git reflogтобі говорить? Ви пробували бігати git fsck?
kynan

Відповіді:


173

Мені вдалося відновити за допомогою:

rm .git/refs/remotes/origin/HEAD
git fetch --all

У моєму випадку це сталося тому, що я видалив деякі локальні та віддалені гілки (якимось чином файл .git / refs / remotes / origin / HEAD залишився у несумісному стані). Зміна вмісту вищезазначеного файлу, щоб вказати на існуючу локальну гілку (наприклад, ref: refs / remotes / origin / master), вирішила цю проблему. Тим не менше, вищезазначений підхід може бути кращим, оскільки HEAD може вказувати на коміт, що не в поточній гілці.
crissdev

Якщо проблема трапляється з конкретним підмодулем git, перша команда трохи змінюється наrm <root repository path>/.git/modules/<path to the submodule>/refs/remotes/origin/HEAD
Gobe

1
Мені довелося це зробити rm -rf .git/refs/remotes/origin, але ти вказав мені правильний напрямок
Джака

23

Почніть з кроків, запропонованих у Відновлення зламаного сховища git :

  • перевірте, чи .git/refsвсе ще містить щось корисне
  • перевірити git reflogі не вдалося .git/logs/refs/heads/masterостаннє вміст будь-якої гілки, в якій ви були
  • запустити git fsck, потенційно за допомогою --unreachableабо--lost-found

Сподіваємось, це дозволить вам зрозуміти, яким masterповинен бути реф, щоб ви могли його відновити (тобто ввести правильний SHA1 .git/refs/heads/master).

Якщо будь-який об'єкт, що міститься у цьому коміті, справді пошкоджений, ви не можете відновити свій HEADкоміт, на жаль. Припускаючи, що ваше робоче дерево та / або індекс є недоторканими, ви можете спробувати git reset --soft(або не виконати це git reset) а до попереднього коміту, а потім повторно зробити коміт. Уникайте будь-яких операцій, які змінюють ваше робоче дерево sa git checkout -fабо git reset --hard.


Я подивився .git/logs/refs/heads/mybranch. Він показує якусь історію комітів до цієї галузі. Перекопуючи це, я вибрав SHA і спробував показати їх за допомогою git show. (У кожному коміті є два SHA, я вибрав другий, безпосередньо перед іменем автора.) Останній був пошкоджений, але той, що був до цього, міг бути git shown, і я зміг його натиснути git push origin abcdef:mybranch.
Ед Авіс,

12

У мене була подібна проблема після синього екрану смерті у Windows 8.1

У мене був файл у цьому місці ...

C:\www\<project>\.git\refs\remotes\origin\<problem-branch>

І воно було порожнім, тоді як інші файли гілок у цій папці мають довгі рядки всередині них.

Примітка. У мене не було змін / комітів

  • Я створив резервну копію <problem-branch>файлу
  • Файл видалено
  • git fetch --all щоб знову отримати гілку

Потім автоматичне заповнення вкладки знову запрацювало


6

Якщо модифікованих файлів мало, я вважаю, що зручним способом вирішення цієї проблеми є:

  1. зробити резервну копію файлів, які ви змінили в репо
  2. видалити існуюче репо
  3. повторно клонувати його з сервера
  4. вставте файли з кроку 1 до репозиторію та git commit -a

так, ніхто не міг подумати про повторне клонування. відмінна пропозиція
Сельман Генч

5

мені вдалося вирішити це шляхом видалення головного файлу в каталозі git \ refs \ heads


Це допомогло, це видалило гілку з мого списку на intellij, і я перевірив її як нову гілку. На щастя, я просунув свої зміни, щоб вони всі були там.
OAM

4

Після обчисленим заморожування і аварії, мій мерзотник філія був пошкоджений з повідомленням: git fatal: your current branch appears to be broken. Я нічого не міг зробити.

Після цього git fsckзгадав, що у філії був error: Invalid HEAD. refs/heads/<branch>мали invalid sha1 pointer.

Дотримуючись тут опцій, я відкрив .git/refs/heads/<branch>редактор блокнота ++, і кожен із символів sha1 був NUL.

На щастя, мені потрібно було лише скинути гілку до віддаленого стану, і це було в репозиторії bitbucket. Я схопив sha1 з кінчика віддаленого репо і скопіював до .git/refs/heads/<branch>збереженого, потім зробив a git reset --hard HEAD, і все повернулося до звичного.


2

Я був досить ідіотом, щоб забути натиснути, і мій комп’ютер зірвався під час виконання коміту. Я міг відновити все, крім останнього коміту, хоча відкривши .git / logs / refs / heads /

Цей файл містить усі коміти (з їх SHA) до гілки, що я зробив для відновлення:

  • Створіть резервну копію останніх змін у тимчасовій папці
  • перейти до "чистого аркуша"
    • git checkout master
    • git reset --hard
  • перевірка другого до останнього коміту в журналі
  • створити гілку з цієї відокремленої голови
  • ПУСКАТИ
  • Відновити останні зміни
  • Знову вчинити

Тож навіть коли ви припускаєтесь німої помилки, вас не відразу повертає цілий день роботи з git :)


1

Я знаю, що це занадто пізня відповідь, але я отримав цю помилку, оскільки не мав origin/head. Ви можете дізнатися це, запустивши git branch -r. Якщо ви не бачите origin/headвказівки на віддалене джерело, ви можете встановити це, запустивши git remote set-head origin {{your branch name}}.

Тепер запустіть git branch -rще раз, і ви побачите щось подібне: origin/HEAD -> origin/develop

Сподіваюсь, це допоможе комусь іншому, хто стикався з цим питанням.


1

Я не зміг перевірити свою головну гілку через помилку ref. У підсумку я видалив: .git/refs/remotes/origin/HEAD .git/refs/remotes/origin/master

і викликає цю команду git:

git fetch --all

1

Вибачте мене, якщо б я повторив за кимось (я не прочитав усіх відгуків). На мій погляд, найпростіший спосіб вирішити проблему - скопіювати проект без .git та .idea, очистити його, клонувати з git, видалити все, крім вищезазначених каталогів, а потім вставити попередню копію в новостворене репо за допомогою .git та .idea . Сподіваюся, це має сенс.


1

Мій комп’ютер зірвався два рази, і в результаті мій репозиторій git поламався локально. Я не зміг внести свої зміни, він попросив встановити віддалене походження, але це не працювало в gitKraken.

У моєму командному рядку я отримав цю помилку введіть тут опис зображення

Я знав, що мої посилання не працюють, і їх потрібно виправити. Що мені потрібно було зробити, це git bash (у SourceTree натисніть на "термінал"). Потім перейдіть до такої папки посилань

cd .git
cd refs
cd remotes
cd origin

там буде назва файлу master, використовуйте, lsщоб побачити, що знаходиться в каталозі. Потім просто видаліть його за допомогою rm master

bam, пошкоджений файл зник. Тепер, якщо ви видасте команду гілки git -a, вона видасть це

$ git branch -a
* master
  remotes/origin/master (this in red color -scary :) )

Потім видайте цю команду, і вона зафіксує ваші посилання

$ git remote set-head origin master

Підводячи підсумок, якщо ви спробуєте витягнути пульт, він повинен показувати пусте ім'я пульта, яке було виправлено.

введіть тут опис зображення


0

У мене була та сама проблема, але не пощастило, не вдалося зрозуміти проблему. Я переніс свій репо в сторону, повторно клонував той із сервера і спробував об'єднати між ними. Звичайно, у ньому було показано багато файлів, не пов’язаних з моєю гілкою, але допомогли виділити необхідні файли.


0

Перевірте, чи MSWindows створив файли desktop.ini, які одночасно успадковують git? це робить для мене. Після того, як я видалю їх усіх у підкаталогах каталогу .git, це працює.


0

У мене була та сама проблема, коли Android Studio раптово припинила роботу (через втрату живлення до комп’ютера).

Я вирішив це, скопіювавши вміст свого C:\Users\myusername\AndroidStudioProjects\MyBrokenApp\.git\refs\heads\masterфайлу до могоC:\Users\myusername\AndroidStudioProjects\MyBrokenApp\.git\refs\remotes\origin\master файл.

(Раніше я також увімкнув опцію "Примусове натискання" в Android Studio, але я не думаю, що це був необхідний крок.)

Примітка:

Я знайшов це рішення, порівнюючи вміст файлів в моєму C:\Users\myusername\AndroidStudioProjects\MyBrokenApp\.git\каталозі (включаючи підкаталоги.) До відповідних файлів тих , хто в іншому здоровому проект - наприклад, C:\Users\myusername\AndroidStudioProjects\MyHealthyApp\.git\.

У вас може бути інший файл, який пошкоджений, але, порівнявши з іншим здоровим проектом, ви зможете швидко виявити, що не так.

Якщо у вас немає іншого здорового проекту, в якому налаштовано git, можливо, варто створити простий так само, як ви створили свій непрацюючий проект, щоб можна було дослідити, порівняти та виправити тощо.

PS - Моє повідомлення про помилку (відредаговане) було: warning: ignoring broken refs/remotes/origin/master.fatal bad revision 'refs/remotes/origin/master..refs/heads/master' during executing git -c core.quotepath=false log refs/remotes/origin/master..refs/heads/master --pretty=format --encoding=UTF-8 -M --name-status -c --

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.