web-dev-qa-db-ja.com

Gitファイルの整合性

最近、開発に使用しているメインマシンが過熱し始めました。私は1日に4つか5つのロックアップを取得し始めました。すべてがフリーズします。私のプロジェクトはすべて、gitを使用してバージョン管理されています。

GoogleでのLinusの講演を見て、gitはファイルが破損しないようにするだろうと言ったことを覚えています。私の状況では、ソースファイルの1つが破損した場合にgitが警告を表示すると想定しても安全です。

OSはMacOS X10.4ファイルシステムはHFS +です。

30
Hamza Yerlikaya

git fsck を使用して、Gitにリポジトリ全体をチェックさせることができます。 Gitリポジトリが破損した場合は、破損していないリポジトリから新しいクローンを取得する必要があります。

通常の操作では、Gitはリポジトリの一部を読み取るときにチェックする必要があるため、破損に気付くのに時間がかかる場合がありますが、最初に気付かれます破損したデータにアクセスしようとする時間。

37
Esko Luontola

Linusが、Gitがファイルが破損していないことを保証すると言ったときの意味は、特定のコミット(ハッシュで識別される)を参照すると、保証それが-になるという事実に言及していました。 常にまったく同じリポジトリの状態を参照します。あなたとLinusのツリーからLinuxカーネルをプルし、彼がいくつかのコミットae6bcd1 ...を参照している場合、コミットae6bcd1 ...を(ローカルリポジトリでも)コミットae6bcd1 ...とは異なる外観にするためにできることは何もありません。コミットLinusは彼がそれを参照するときに見ています。

さらに、コミットオブジェクトにはその親コミット(のすべて)への参照が含まれているため、コミットを参照すると、DAGでもその完全な履歴が保証されます。

ファイルの破損に関しては、その種の独立した問題です。ただし、作業ツリーファイルの1つが破損した場合でも、実際のBLOBオブジェクト(つまり、.git/objects/ob/ject_hashname)を破損することなく、以前のコミット状態またはインデックス/キャッシュ状態から復元できます。

この場合、強制プッシュ(リモートの履歴を上書きする)を実行しない限り、リモートを破損することはありません。プッシュにより、コミットオブジェクトが連続した履歴グラフを形成することが保証されるためです。

9
Matt Enright

最近、クラッシュしたサーバーのリポジトリを確認する必要がありました。次のコマンドを使用しました。

for gitdir in  $(Sudo find / -name ".git" -type d -printf "%h "); do
  cd $gitdir && ( git fsck && echo "${gitdir} - "'HAPPY !' ) \
  || echo "${gitdir} - "'ERROR !';
done
6
Jamie