2012-03-09 33 views
13

Kế hoạch của tôi là sử dụng git để theo dõi các thay đổi trong/etc nhưng khi cam kết tôi muốn có người thực hiện thay đổi xác định mình là tác giả bằng cách thêm - -author tùy chọn trên dòng lệnh.Dừng một git cam kết bởi một tác giả cụ thể bằng cách sử dụng móc trước cam kết

Vì vậy, tôi muốn dừng cam kết ngẫu nhiên dưới dạng gốc.

Tôi đã thử tạo móc trước nhưng không hoạt động - git var vẫn đang trở về gốc ngay cả khi tôi chỉ định tác giả trên dòng cam kết.

AUTHOR=`git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/\1/p'` 
if [ "$AUTHOR" == "root <[email protected]>" ]; 
then 
    echo "Please commit under your own user name instead of \"$AUTHOR\":" 
    echo 'git commit --author="Adrian"' 
    echo "or if your name is not already in logs use full ident" 
    echo 'git commit --author="Adrian Cornish <[email protected]>"' 
    exit 1 
fi 
exit 0 
+1

Thật ngạc nhiên có vẻ không phải là một cách để có được thông tin này. Tôi có thể xác nhận rằng 'git var GIT_AUTHOR_IDENT' hiển thị tác giả gốc, không phải là tác giả được cung cấp qua' --author' ... – Borealid

+0

Tiếp tuyến cũng https://gist.github.com/tripleee/16767aa4137706fd896c – tripleee

Trả lời

10

Phiên bản hiện tại của Git không cung cấp thông tincho Git qua biến môi trường, đối số dòng lệnh hoặc stdin. Tuy nhiên, thay vì đòi hỏi việc sử dụng các dòng --author lệnh, bạn có thể hướng dẫn người dùng thiết lập các biến GIT_AUTHOR_NAMEGIT_AUTHOR_EMAIL môi trường:

#!/bin/sh 
AUTHORINFO=$(git var GIT_AUTHOR_IDENT) || exit 1 
NAME=$(printf '%s\n' "${AUTHORINFO}" | sed -n 's/^\(.*\) <.*$/\1/p') 
EMAIL=$(printf '%s\n' "${AUTHORINFO}" | sed -n 's/^.* <\(.*\)> .*$/\1/p') 
[ "${NAME}" != root ] && [ "${EMAIL}" != "[email protected]" ] || { 
    cat <<EOF >&2 
Please commit under your own name and email instead of "${NAME} <${EMAIL}>": 
GIT_AUTHOR_NAME="Your Name" GIT_AUTHOR_EMAIL="[email protected]" git commit 
EOF 
    exit 1 
} 

Giống như lập luận --author, các biến môi trường kiểm soát tác giả cam kết của. Vì các biến môi trường này nằm trong môi trường của Git, chúng cũng nằm trong môi trường của móc pre-commit. Và bởi vì chúng nằm trong môi trường của móc pre-commit, chúng được chuyển đến git var GIT_AUTHOR_IDENT sử dụng chúng như git commit.

Thật không may, việc đặt các biến này kém thuận tiện hơn nhiều so với sử dụng --author. Tôi khuyên bạn nên liên hệ với các nhà phát triển Git và yêu cầu họ đặt các biến môi trường này (sử dụng giá trị được chuyển qua --author) trước khi khởi chạy móc pre-commit.

+0

Cảm ơn điều này đúng như tôi truy nã. Tôi đã thử git var trên GIT_AUTHOR_NAME và GIT_AUTHOR_EMAIL và nó luôn trống - điều này giải thích tại sao. –

+0

Điều này không chính xác hơn bất kỳ lúc nào, có vẻ như hoạt động với GIT 2.7.4 (mabye cũng sớm hơn). Đặt 'echo $ GIT_AUTHOR_NAME' vào một móc' pre-commit' sẽ in ra tên tác giả (tên được đặt trong cấu hình git hoặc cái được chuyển qua '--author'). Ngoài ra 'git var GIT_AUTHOR_IDENT' dường như làm việc với' --author'. – lumbric

0

Tôi đã sử dụng các mục sau, thêm phần này vào hệ thống .bashrc.

Nó sẽ không bắt dân gian thực sự su để gốc và sống trong vỏ đó, (xấu!) Nhưng nó giữ nhật ký của tôi hữu ích khi dân gian chỉ sử dụng sudo. Tôi cũng đang cố gắng giữ một/etc changelog với git - vì vậy tôi có thể xem những gì được thực hiện từng tháng.

#I want everyone to check in changes to /etc files, but also want their names even when they use sudo. 
export GIT_COMMITTER_EMAIL=${USER}@ourcompany.co.nz 
export GIT_AUTHOR_EMAIL=${USER}@ourcompany.co.nz 

https://serverfault.com/questions/256754/correct-user-names-when-tracking-etc-in-git-repository-and-committing-as-root

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