2011-10-27 9 views
9

Eminim ki, emin olmadan emin olmak için master dalına yanlışlıkla bir şey yapmayı durdurmak istiyorum. Bu yüzden hangi senaryoda olduğumu belirlemek için bu senaryoyu denedim ama bir problem var. Ben diğer dalıGit taahhütlerini durdurmak için git-hook ön-işlemi nasıl kullanılır

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

üzerinde olduğum halde yeni şube git adı-rev döner ustası oluşturduğunuzda Bu benim senaryom.

#!/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 

Mark için: Son kararlı etikete ve aynı sonuçlara karşı git yeniden oluşturdum. Sadece yeni şubeye bir taahhüt yapıldıktan sonra çalışır.

$ 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

Hangi sürüm sürümünü kullanıyorsunuz ve hangi işletim sisteminde? Eğer gerçekten kopyaladıysanız ve doğru bir şekilde yapıştırdıysanız, 'git dalı-sonra 'git name-rev HEAD' (sonuçları), (şaşırtıcı) bir hata gibi görünür. –

+0

Ben kaynağından budala inşa - Son inşa $ git 2.6.40.3-0.fc15 iceweasel.bluedreamer v1.7.7-RC3 $ git version git sürüm 1.7.7-rc3 $'uname -a Linux tarif edilmiştir .x86_64 # 1 SMP Sal Ağustos 16 04:10:59 UTC 2011 x86_64 x86_64 x86_64 GNU/Linux –

cevap

11

Bu komut, bir işlemin kolay bir adını bulmak için kullanılır. Olan şey, HEAD'in ilk önce taahhüdün sha1'ine çözüm getirmesi ve daha sonra bir ismin belirlenmesidir. Sanırım ilk olarak, git log --decorate'un karşısına çıkacak olan adla ilgili olarak ana için rasgele bir seçim yapıyorsunuz.

Az önce test git branch çıkışını ayrıştırmak olacaktır:

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

veya daha doğrudan bir yol olacaktır:

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

Serin - Teşekkürler Adam - Küçük bir değişiklik yaptım ama şimdi çalışıyorsa ["$ (git symbolic-ref HEAD 2>/dev)/null) "==" refs/heads/master "] –

+0

Güzel .. Diğerlerinin yararı için cevabı düzenleyeceğim. –

8

this answer önerildiği gibi git rev-parse kullanabilirsiniz Alternatif olarak. Yani ifade şu şekilde olur:

"$(git rev-parse --abbrev-ref HEAD)" == "master"