なぜ git は切り離されたヘッドへのコミットを許可するのですか? それを無効にできる pre commit フックはありますか? 目的は何ですか?多くの新しい開発者がこれを行っており、無効にする方法を見つけたいと思っています。
3 に答える
これはローカル git フックによってのみ防止できるpre-commitため、開発者はそれを作成する必要があります。your-local-project/.git/hooks/pre-commit次の内容のファイルを追加します。
#!/bin/sh
if ! git symbolic-ref HEAD &> /dev/null; then
echo "You are in a detached head state! Commit has been blocked. (Use --no-verify to bypass this check.)"
exit 1
fi
実行可能であることを確認してください。クレジットは svachalek に送られます
git がデタッチされた HEAD でのコミットを防止する必要があるのはなぜですか? 分離されたHEAD は、作業中のリポジトリの状態へのポインターがないことを意味するだけです。自分が何をしているのかを知っていることを前提としています。
あなたのチームの多くの開発者がこの状態に陥った理由を調査したいと思いますか? 多分彼らはいくつかの奇妙なワークフローを適用しますか?
git checkout $commit-sha1分離した HEAD につながる可能性があります。そうgit checkout FETCH_HEADです。切り離された HEAD は、名前のないブランチと見なすことができます。混乱しない場合は、無視してかまいません。@fraczが言ったように、pre-commit. という名前のブランチにすることもできますgit checkout -b some_name。フックは、分離された HEAD 状態を検出してブランチにするのpost-checkoutに役立つ場合があります。
Git はこれを多くの操作で内部的に使用します。切り離された HEAD モードでは、単に (1 つの、単一の、特別な) 匿名ブランチに移動し、後で匿名ブランチに名前を付けることができます。
これは、たとえば、git rebaseコミットを元のチェーンから新しいチェーンにコピーする方法です。最初に、この切り離された HEAD モードを使用して、--ontoターゲットのコミット (--ontoデフォルトは) をチェックアウトします。<upstream>次に、コピーするコミットごとに、そのコミットをコピーします (git cherry-pickまたは同等のものを使用: 詳細は、対話型リベースと非対話型リベースによって異なり、対話型の場合はさらに多くの詳細があります)。最後に、コピーされた最後のコミットを指すように、既存のブランチ ラベルを移動します。