2016-06-13 3 views
1

その事前コミットのgitでHEADが存在することを確認するようです。そうでなければ、インデックスを比較するために空のツリーの特別なハッシュにデフォルト設定されます。gitのプリコミットフックがHEADが存在することを確認するのはなぜですか?

if git rev-parse --verify HEAD >/dev/null 2>&1 
then 
     against=HEAD 
else 
     # Initial commit: diff against an empty tree object 
     against=4b825dc642cb6eb9a060e54bf8d69288fbee4904 
fi 

デフォルトのハッシュは特別なハッシュです。私はまた、

git hash-object -t tree < /dev/null 

against経由でそれを得ることができることを読んで、この

# If there are whitespace errors, print the offending file names and fail. 
exec git diff-index --check --cached $against -- 

はなぜフックはそれをするのかのように、後に使用されていますか?どのような状況で私はコミットを行うことができますが、HEADは無効になりますか?

答えて

1

HEADので、常に、現在のコミットを指す:それは実際のコミットIDを直接指す(例えばref: refs/heads/masterなど)、現在のブランチの名前が含まれている、または

    • (A "detached HEAD")、SHA-1ハッシュ文字列を含んでいます。

    HEADは、生のハッシュ値が含まれている場合、それはコミット本物を指すように持っているので、その後HEADは、間違いなく有効です。しかし、まったく新しい、空のリポジトリではどうなりますか?

    あなたは支店にいますmasterだから、HEADref: refs/heads/masterとなります。しかし、支店の先端は何ですかmaster?コミットIDはmaster自体に格納されていますか?

    リポジトリにコミットがありません。 masterポイントはどこにありますか?

    この問題に対するGitの解決策は、masterを無効にすることです。それはgit rev-parse --verify HEADが失敗したときです:HEADmasterと言いますが、masterはまだ存在しません。

    内部的に、Gitはこれを "未枝"と呼びますが、時には "孤立した枝"とも呼ばれます。 git checkout --orphan newbranchを使用すると、新しく作成されたものと同じ状態にGitが置かれます(実際には作成されていないことを除いてまだ)。newbranchです。 HEADにはref: refs/heads/newbranchが含まれていますが、まだnewbranchはありません。したがって、すべての未分枝状態はこのようなものですが、新しい空のリポジトリを作成するたびに、特定のものがあります。

  • 関連する問題