2011-10-27 5 views
9

確かに私が間違ってマスターブランチに何かをコミットしないようにしたいと思います。だから、私はこのブランチを試してみたが、問題がある。私が新しいブランチを作成すると、他のブランチ上にあっても名前revがマスターを返します。git hook pre-commitを使用してマスタへのコミットを停止する方法

$ git branch 
    ignore 
    master 
* set_support 
$ git name-rev --name-only HEAD 
master 

これは私のスクリプトです。

#!/bin/sh 
# Check to see if we are on master branch. Stop accidental commits 
if [ "`git name-rev --name-only HEAD`" == "master" ] 
then 
    if [ -f i_want_to_commit_to_master ] 
    then 
     rm i_want_to_commit_to_master 
     exit 0 
    else 
     echo "Cannot commit to master branch Adrian" 
     echo "Remember to create file 'touch i_want_to_commit_to_master' to commit to master" 
    fi 
    exit 1 
fi 
exit 0 

マーク:最新の安定タグと同じ結果に対してgitを再構築しました。新しいブランチにコミットした後でのみ動作します。

$ mkdir gittest 
$ cd gittest 
$ git init 
Initialized empty Git repository in /home/adrian/gittest/.git/ 
$ touch file1 
$ git add file1 
$ git commit 
[master (root-commit) 7c56424] New file 
0 files changed, 0 insertions(+), 0 deletions(-) 
create mode 100644 file1 
$ git branch 
* master 
$ git checkout -b new_branch 
Switched to a new branch 'new_branch' 
$ git name-rev --name-only HEAD 
master 
$ git --version 
git version 1.7.7.1 
$ git branch 
    master 
* new_branch 
$ touch file2 
$ git add file2 
$ git commit 
[new_branch 1e038fb] new file 
0 files changed, 0 insertions(+), 0 deletions(-) 
create mode 100644 file2 
$ git name-rev --name-only HEAD 
new_branch 
+0

使用しているgitのバージョンはどのオペレーティングシステムですか? 'git branch'と' git name-rev HEAD'の結果は、実際に正確にコピーして貼り付けた場合、(驚くべき)バグのように見えます。 –

+0

私はソースからのgitを構築する - 最後のビルドは、$ gitのは v1.7.7-RC3 $ gitの--version gitのバージョン1.7.7-RC3 $のuname -a のLinux iceweasel.bluedreamer 2.6.40.3-0.fc15を説明しました.x86_64#1 SMP Tue Aug 16 04:10:59 UTC 2011 x86_64 x86_64 x86_64 GNU/Linux –

答えて

11

このコマンドは、コミットのフレンドリ名を見つけるために使用します。起こっているのは、HEADが最初にコミットのsha1に解決してから、名前が決定されるということです。私はそれが最初に何のgit log --decorateが出くわすだろうに来るので、それは名前のために任意にマスターを選んでいると思います。

私はちょうどあなたのテストでgit branchの出力を解析します:

"`git branch | grep \* | cut -f2 -d' '` == "master" 

以上の直接的な方法は、次のようになります。

$(git symbolic-ref HEAD 2>/dev/null) == "refs/heads/master" 
+1

クール - ありがとうアダム - 私は小さな変更を加えましたが、今のところ "$(git symbolic-ref HEAD 2/dev/null) "==" refs/heads/master "] –

+0

ニース。私は他人の利益のために答えを編集します。 –

8

this answerで提案されているようにあなたがgit rev-parse使用できる代替手段として。したがって、if式は次のようになります。

"$(git rev-parse --abbrev-ref HEAD)" == "master" 
関連する問題