2016-05-17 11 views
1

gitで分離ヘッドにコミットするのはなぜですか?それを無効にすることができます事前コミットフックはありますか?目的は何ですか?多くの新しい開発者がこれを行い、私はそれを無効にする方法を見つけたいと思います。分離HEADでのコミットを防ぐ方法

答えて

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 

実行可能であることを確認してください。 Credits go to svachalek

なぜ、gitは分離されたHEADでコミットを防止する必要がありますか? Detached HEADは、作業中のリポジトリの状態へのポインタがないことを意味します。あなたがしていることをあなたが知っていることを前提としています。

あなたのチームの多くの開発者がこの状態になる理由を調査したいと思いますか?多分彼らはいくつかの奇妙な作業を適用するでしょうか?

+1

これにより、ヘッドの切り離しを防ぐことができますが、(インタラクティブ)リベース操作にも影響します。内部的には、リベースはデタッチされたヘッドを使用してコミットを再生します。 – ad22

+1

リベースを許可するには、[検出する](http://stackoverflow.com/questions/3921409/how-to-know-if-there-is-a-git-rebase-in-progress)が必要です。しかし、インタラクティブなリベースを行い、同時にHEADを分離してコミットするのを恐れている開発者はほとんど想像できません。 – fracz

1

git checkout $commit-sha1は、取り外したHEADにつながる可能性があります。それでgit checkout FETCH_HEADもそうです。切り離されたHEADは、名前のないブランチと見なすことができます。それがあなたを混乱させないならば、あなたはそれを無視することができます。 @fraczが言ったように、あなたはpre-commitでそれを防ぐことができます。 git checkout -b some_nameという名前のブランチにすることもできます。 A post-checkoutフックを使用すると、切り離されたHEAD状態を検出して分岐することができます。

+0

+1 'post-checkout'フックでのブランチ作成のアイデア。しかし、ランダムな名前のブランチを作成しなければなりません。そのブランチは時間の経過とともに大きな混乱を招きます。 – fracz

+0

@fraczはい、ランダムブランチ名が実際問題です。我々は、適切な名前を見つけるためにいくつかの論理を使用することができますが、対照的に、それはまだ少し面倒です。だから、それを無視するか、根本的な原因を見つけて事前に防止してください。私が知っているように、 'repo start'がない' repo sync'は、Repoが使用されている場合、HEAD状態を解除することもあります。 – ElpieKay

+0

'post-commit'フックでブランチを作成すると、実際に何かをコミットしたくないときにブランチを作成することがなくなります。 https://gist.github.com/ben-cohen/316f89c763e9d8a027335261a44c4954を参照してください。 –

0

Gitはこれを多くの操作に内部的に使用します。分離されたHEADモードは、(1つの、単一の、特別な)匿名ブランチであなたを取得し、匿名ブランチには後で名前を付けることができます。

これは、たとえば、git rebaseがコミットを元のチェーンから新しいチェーンにコピーする方法です。最初に、この切り離されたHEADモードを使用して、--ontoターゲットコミット(がデフォルトで<upstream>)をチェックします。次にコピーするコミットごとにコミットをコピーします(git cherry-pickまたはこれと同等のもの:対話型対非対話型のリベースによって詳細が異なります)。最後に、既存のブランチラベルを移動して、最後にコピーされたコミットを指すようにします。

関連する問題