2011-10-27 34 views
9

Tôi muốn dừng bản thân mình vô tình cam kết điều gì đó với nhánh chính trừ khi tôi chắc chắn. Vì vậy, tôi đã thử kịch bản này để xác định nhánh nào tôi đang ở nhưng có một vấn đề. Khi tôi tạo chi nhánh mới, tên git-rev sẽ trả lại tổng thể ngay cả khi tôi ở chi nhánh khácLàm thế nào để sử dụng git hook pre-cam kết để ngừng cam kết làm chủ

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

Đây là tập lệnh của tôi.

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

Đối với nhãn hiệu: Tôi xây dựng lại git dựa trên thẻ ổn định mới nhất và kết quả tương tự. Nó chỉ hoạt động sau khi một cam kết được thực hiện cho chi nhánh mới.

$ 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

Bạn đang sử dụng phiên bản git nào và trên hệ điều hành nào? Những kết quả từ 'git branch' theo sau bởi' git name-rev HEAD' trông giống như một lỗi (đáng ngạc nhiên), nếu bạn đã thực sự sao chép và dán chính xác. –

+0

tôi xây dựng git từ nguồn - xây dựng cuối cùng được $ git mô tả v1.7.7-rc3 $ git --version git phiên bản 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 –

Trả lời

11

Lệnh này được sử dụng để tìm tên thân thiện của cam kết. Điều đang xảy ra là HEAD đang giải quyết cho sha1 của các cam kết đầu tiên và sau đó một tên được xác định. Tôi đoán nó là tự ý chọn chủ cho tên như nó đi lên đầu tiên trong những gì git log --decorate sẽ đi qua.

tôi sẽ chỉ phân tích đầu ra của git branch trong thử nghiệm của bạn:

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

hoặc một cách trực tiếp hơn sẽ là:

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

Tuyệt vời - Cảm ơn Adam - Tôi đã thực hiện một thay đổi nhỏ nhưng bây giờ nó hoạt động nếu ["$ (git symbolic-ref HEAD 2>/dev/null) "==" refs/heads/master "] –

+0

Nice .. Tôi sẽ chỉnh sửa câu trả lời vì lợi ích của người khác. –

8

Là một thay thế bạn có thể sử dụng git rev-parse như đề xuất trong this answer. Vì vậy, nếu biểu thức sẽ là:

"$(git rev-parse --abbrev-ref HEAD)" == "master" 
Các vấn đề liên quan