Sử dụng móc cập nhật
Bạn biết về móc - vui lòng, đọc documentation về họ! Móc bạn có thể muốn là cập nhật, được chạy một lần cho mỗi ref. (Các móc trước khi nhận được chạy một lần cho toàn bộ đẩy) Có tấn và tấn câu hỏi và câu trả lời về các móc đã có trên SO; tùy thuộc vào những gì bạn muốn làm, bạn có thể có thể tìm thấy hướng dẫn về cách viết móc nếu bạn cần.
Để nhấn mạnh rằng điều này thực sự là có thể, một trích dẫn từ các tài liệu:
móc này có thể được sử dụng để ngăn chặn bản cập nhật bắt buộc trên refs nhất định bằng cách đảm bảo rằng tên đối tượng là một đối tượng cam kết đó là một con cháu của đối tượng commit được đặt tên bởi tên đối tượng cũ. Nghĩa là, để thực thi chính sách "chỉ chuyển tiếp nhanh".
Nó cũng có thể được sử dụng để đăng nhập trạng thái cũ..new.
Và các chi tiết cụ:
Các móc thực hiện một lần cho mỗi ref phải được cập nhật, và có ba thông số:
- tên của ref đang được cập nhật,
- sự tên đối tượng cũ được lưu trữ trong ref,
- và tên đối tượng mới sẽ được lưu trữ trong ref.
Vì vậy, ví dụ, nếu bạn muốn chắc chắn rằng không ai trong số các cam kết đối tượng dài hơn 80 ký tự, một thực hiện rất thô sơ sẽ là:
#!/bin/bash
long_subject=$(git log --pretty=%s $2..$3 | egrep -m 1 '.{81}')
if [ -n "$long_subject" ]; then
echo "error: commit subject over 80 characters:"
echo " $long_subject"
exit 1
fi
Tất nhiên, đó là một ví dụ đồ chơi; trong trường hợp chung, bạn sẽ sử dụng đầu ra nhật ký chứa thông báo cam kết đầy đủ, chia nhỏ thông tin cho mỗi cam kết và gọi mã xác minh của bạn trên từng thư cam kết riêng lẻ.
Tại sao bạn muốn móc cập nhật
Điều này đã được thảo luận/làm rõ trong nhận xét; đây là một bản tóm tắt.
Móc cập nhật chạy một lần cho mỗi lần nhập. Một ref là một con trỏ tới một đối tượng; trong trường hợp này, chúng ta đang nói về các chi nhánh và các thẻ, và thường chỉ là các nhánh (mọi người không đẩy các thẻ thường xuyên, vì chúng thường chỉ để đánh dấu các phiên bản).
Bây giờ, nếu người dùng đang đẩy bản cập nhật cho hai chi nhánh, hoàn thiện và thực nghiệm:
o - o - o (origin/master) - o - X - o - o (master)
\
o - o (origin/experimental) - o - o (experimental)
Giả sử X là "xấu" cam kết, ví dụ một trong đó sẽ thất bại móc cam-msg. Rõ ràng chúng tôi không muốn chấp nhận sự thúc đẩy để làm chủ. Vì vậy, hook cập nhật từ chối điều đó. Nhưng không có gì sai với các cam kết về thử nghiệm! Hook cập nhật chấp nhận cái đó. Vì vậy, nguồn gốc/master vẫn không thay đổi, nhưng nguồn gốc/thực nghiệm được cập nhật:
o - o - o (origin/master) - o - X - o - o (master)
\
o - o - o - o (origin/experimental, experimental)
The pre-nhận móc chạy chỉ một lần, chỉ cần trước khi bắt đầu cập nhật refs (trước khi lần đầu tiên móc cập nhật được chạy). Nếu bạn sử dụng nó, bạn sẽ phải làm cho toàn bộ sự thất bại, do đó nói rằng bởi vì có một thông điệp cam kết xấu về chủ, bạn bằng cách nào đó không còn tin tưởng rằng các cam kết thử nghiệm là tốt mặc dù tin nhắn của họ là tốt!
Tôi nghĩ rằng móc mà OP đang tìm kiếm là tiền nhận, vì anh ta muốn từ chối toàn bộ thao tác đẩy tùy thuộc vào thông điệp cam kết. Tuy nhiên, AFAIK, không được nhận trước cũng như không cập nhật nhận được thông báo cam kết làm đầu vào. Vì vậy, việc sử dụng commit-msg có lẽ sẽ là giải pháp tốt nhất. –
@Can: Tôi khá chắc chắn rằng OP muốn cập nhật, chứ không phải trước khi nhận. "Đẩy toàn bộ" có nghĩa là đẩy cho tất cả các chi nhánh. Nếu người dùng cố gắng đẩy cập nhật vào ba chi nhánh và chỉ một người chứa thông báo cam kết không hợp lệ, thì hai người kia vẫn phải được chấp nhận! – Cascabel
@Can: Và không, thông báo cam kết không phải là một phần của đầu vào, nhưng tên đối tượng cũ (mới) (SHA1)). Lưu ý rằng hook cập nhật được thực hiện ngay trước khi các ref được cập nhật (sau khi các đối tượng commit đã được nhận). Do đó, hook có thể sử dụng git log để kiểm tra bất cứ điều gì nó muốn về các cam kết giữa cũ và mới, bao gồm cả các thông điệp cam kết của chúng. – Cascabel