2015-03-24 16 views
10

Tôi có một Git tiền cam kết móc mà ngăn cản tôi cam kết làm chủ trừ khi bị ghi đè, để khuyến khích phát triển trên chi nhánh.Làm cách nào để cho phép git merge cam kết làm chủ nhưng ngăn các cam kết không hợp nhất?

Tuy nhiên tôi muốn tự động cho phép hợp nhất các cam kết thành thạo. Có cách nào để xác định một cam kết hợp nhất từ ​​kịch bản móc trước khi cam kết của tôi? Các kịch bản trông như thế này:

#!/bin/bash 

BRANCH=`git branch --color=never| grep '^*'|cut -c3-` 

if [ "${BRANCH}D" == "masterD" -a "${GIT_COMMIT_TO_MASTER}D" != "trueD" ] 
then 
    echo "Commit directly to master is discouraged." 
    echo "If you want to do this, please set GIT_COMMIT_TO_MASTER=true and then commit." 
    exit 1 
fi 

SOLVED: Đối với bất cứ ai tìm kiếm một cắt-và-dán, phiên bản làm việc của kịch bản móc này là:

#!/bin/bash 

BRANCH=$(git rev-parse --abbrev-ref HEAD) 

if [ "${BRANCH}" == "master" -a "${GIT_COMMIT_TO_MASTER}" != "true" ] 
then 
    if [ -e "${GIT_DIR}/MERGE_MODE" ] 
    then 
    echo "Merge to master is allowed." 
    exit 0 
    else 
    echo "Commit directly to master is discouraged." 
    echo "If you want to do this, please set GIT_COMMIT_TO_MASTER=true and then commit." 
    exit 1 
    fi 
fi 
+1

Gợi ý: một cách mạnh mẽ hơn để có được nhánh hiện tại là 'branch = $ (git rev-parse --abbrev-ref HEAD)'. – Jubobs

+0

Cảm ơn, tôi sẽ thử điều đó. –

+1

@Jubobs: nói chung tốt hơn nên sử dụng 'git symbolic-ref HEAD'. Người ta có thể thêm '-q' nếu cần - nó sẽ nằm trong trường hợp này và sau đó bạn muốn thoát 0, vì vậy trong trường hợp * cụ thể * này, sử dụng' git rev-parse' cũng có thể tốt hơn: đầu bạn sẽ chỉ nhận được 'HEAD' trở lại, không khớp với' master'. – torek

Trả lời

6

tôi đặt một vài ý kiến ​​trong , nhưng điều quan trọng ở đây là trong trước móc kết nối, cam kết bạn sắp thử nghiệm chưa tồn tại, vì vậy bạn không thể đếm được cha mẹ của nó.

Đây là những gì bạn nhận được:

  • Nếu bạn đang sử dụng git commit --amend-sửa đổi một hợp nhất cam kết, trước cam kết nối được chạy như bình thường, nhưng nó có thể không thực sự phát hiện rằng đây đang xảy ra. Cam kết mới sẽ là hợp nhất, nhưng bạn không thể biết được.

  • Nếu bạn đang sử dụng thông thường git commit để tạo cam kết không hợp nhất, tệp MERGE_HEAD sẽ không tồn tại trong thư mục git và bạn có thể biết rằng điều này sẽ không tạo ra cam kết hợp nhất.

  • Nếu bạn đang sử dụng git commit để kết thúc một hợp mâu thuẫn, các tập tin MERGE_HEADsẽ tồn tại, và bạn có thể nói rằng điều này sẽ tạo ra một hợp nhất cam kết.

  • Nếu bạn đang chạy git merge và nó thành công ngày của riêng mình, nó làm cho một mới cam kết không sử dụng pre-cam kết nối, vì vậy bạn thậm chí không nhận được viện dẫn ở đây.

Do đó, nếu bạn sẵn sàng để cho phép git commit --amend về hòa trộn để đạn không nổ, bạn có thể nhận được gần với những gì bạn muốn: chỉ thử nghiệm cho sự tồn tại của $GIT_DIR/MERGE_HEAD để xem nếu điều này là một git commit rằng đây đã hoàn thành một hợp nhất xung đột. (Việc sử dụng $GIT_DIR là một mẹo để thực hiện công việc này ngay cả khi các lệnh được chạy bên ngoài cây git. Git đặt $GIT_DIR để các lệnh git trong móc sẽ hoạt động đúng.)

+0

Điều đó có vẻ đầy hứa hẹn. Tôi rất vui vì 'git commit --amend' yêu cầu ghi đè, vì vậy việc kiểm tra' $ {GIT_DIR/MERGE_HEAD} 'chính xác là những gì tôi đang tìm kiếm. Tôi sẽ kiểm tra và nếu tôi không gặp bất kỳ vấn đề nào, tôi sẽ chấp nhận câu trả lời này. –

Các vấn đề liên quan