コンピューターが死んだ後、Gitリポジトリーが壊れる


94

コンピューターが停止し、gitリポジトリの1つが壊れました。マスターをチェックアウトしようとすると、次のように表示されます。

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>)?
2013年

私はこれが明白であることを知っていますが、それでも質問します-同じgitリポジトリのリモートリポジトリはありますか?
Tuxdude 2013年

内容は、@poke .git/refs/heads/master/の集まりです^@
vainolo

@Tuxdudeはい、しかし私の最新の変更に更新されていません
vainolo 2013年

1
何をgit reflog教えてくれますか?走ってみましたgit fsckか?
kynan 2013年

回答:


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、あなたは私を正しい方向に向けました
Jacka

23

まず、壊れたgitリポジトリの回復で提案されている手順に従います

  • .git/refsまだ有用なものが含まれているかどうかを確認します
  • 最後に行ったブランチのgit reflog内容.git/logs/refs/heads/masterまたはブランチを確認して失敗する
  • 実行git fsck--unreachableまたはまたは--lost-found

これはうまくいけば、masterrefがどうあるべきかを理解できるので、それを復元できます(つまり、正しいSHA1をcatして.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。(各コミットには2つのSHAがあり、著者の名前の直前で2番目を選択しました。)最後の1つは壊れていましたが、その前の1つはgit shownである可能性があり、でプッシュすることができましたgit push origin abcdef:mybranch
Ed Avis 2017年

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ブランチが次のメッセージで破損しました: git fatal: your current branch appears to be broken。何もできませんでした。

行った後git fsck、支店にはerror: Invalid HEADrefs/heads/<branch>がありましたinvalid sha1 pointer

ここのオプションに従って、.git/refs/heads/<branch>notepad ++エディターで開いたところ、sha1の各文字はでしたNUL

幸い、ブランチをリモート状態にリセットする必要があるだけで、それはbitbucketリポジトリにありました。私はリモートリポジトリの先端からsha1を取得し、.git/refs/heads/<branch>保存したコピーにコピーしてから、を実行してgit reset --hard HEAD、すべてを通常に戻しました。


2

プッシュを忘れるほど馬鹿でしたが、コミットの実行中にコンピューターがクラッシュしました。.git / logs / refs / heads /を開くことで、最後のコミット以外はすべて回復できました

このファイルには、ブランチへのすべてのコミット(およびそのSHA)が含まれています。

  • 一時フォルダーへの最新の変更のバックアップ
  • 「白紙の状態」に移行する
    • git checkout master
    • git reset --hard
  • ログの最後から2番目のコミットをチェックアウトする
  • この切り離されたヘッドからブランチを作成します
  • 押す
  • 最新の変更を復元する
  • もう一度コミット

だから、あなたが愚かな間違いをしたときでも、gitでの丸一日の仕事にすぐに取り戻されることはありません:)


1

遅すぎる応答であることはわかっていますが、がないため、このエラーが発生していましたorigin/head。これは、を実行して確認できますgit branch -rorigin/headリモートオリジンへのポインティングが表示されない場合は、を実行してこれを設定できますgit remote set-head origin {{your branch name}}

git branch -rもう一度実行すると、次のように表示されます。 origin/HEAD -> origin/develop

これがこの問題に遭遇している他の人に役立つことを願っています。


1

cannot lock refエラーのため、masterブランチをチェックアウトできませんでした。私は最終的に削除しました: .git/refs/remotes/origin/HEAD .git/refs/remotes/origin/master

そして、このgitコマンドを呼び出します:

git fetch --all

1

誰かの後で繰り返してしまうのであれば、許してください(すべてのフィードバックを読んだわけではありません)。私の意見では、問題を解決する最も簡単な方法は、.gitと.ideaなしでプロジェクトをコピーし、クリーンアップし、gitからクローンを作成し、上記のディレクトリ以外をすべて削除してから、以前のコピーを.gitと.ideaで新しく作成したリポジトリに貼り付けることです。それが理にかなっているといいのですが。


1

コンピューターが2回クラッシュし、その結果、gitリポジトリがローカルで破損しました。変更をプルできませんでした。リモートオリジンを設定するように求められましたが、gitKrakenでは機能しませんでした。

コマンドプロンプトで、このエラーが発生しました ここに画像の説明を入力してください

参照が壊れており、修正する必要があることを知っていました。私がしなければならなかったことは、git bash(SourceTreeで「ターミナル」をクリック)することです。次に、このような参照フォルダーに移動します

cd .git
cd refs
cd remotes
cd origin

そこにファイル名masterがありますls。ディレクトリに何があるかを確認するために使用します。次に、rm masterを使用して削除します

バム、壊れたファイルはなくなった。git branch command -aを発行すると、これが出力されます

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

次に、このコマンドを発行すると、参照が修正されます

$ git remote set-head origin master

要約すると、リモートをプルしようとすると、修正された空白のリモート名が表示されます。

ここに画像の説明を入力してください


0

私は同じ問題を抱えていましたが、運が悪く、問題を理解できませんでした。私は自分のリポジトリを脇に持っていき、サーバーからそれを再クローンして、それらの間でマージしようとしました。もちろん、それは私のブランチに関連しない多くのファイルを示しましたが、必要なファイルを分離するのに役立ちます。


0

MSWindowsがgitを悩ませているdesktop.iniファイルを作成したかどうかを確認しますか?それは私のために行います。.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 --

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.