2011-02-02 41 views
9

Tôi mới dùng git và tôi muốn có thể nắm bắt thông điệp cam kết sau khi đẩy đến nguồn gốc/chủ và chạy tập lệnh bash (trên máy chủ) về những gì chuỗi chứa.Làm thế nào để chụp một thông điệp cam kết git và chạy một hành động

Ví dụ, nếu git tôi cam kết thông báo cho biết: [email] my commit message

Nếu thông báo cam kết chứa [email] sau đó làm một hành động cụ thể, nếu không, đừng làm điều đó.

Dưới đây là một kịch bản mẫu bash Tôi đang nghĩ đến việc sử dụng trong post-receive móc:

#!/bin/bash 

MESSAGE= #commit message variable? 

if [[ "$MESSAGE" == *[email]* ]]; then 
     echo "do action here" 
else 
     echo "do nothing" 
fi 

Về cơ bản tất cả tôi cần phải biết là những gì các tên biến cho các cam kết thông báo là, để sử dụng trong bash trên kịch bản? Ngoài ra, tôi không chắc liệu đây có phải là móc thích hợp để làm điều này hay không.

Trả lời

24

Tôi nghĩ rằng tôi đã tìm ra câu trả lời cho câu hỏi của riêng tôi; biến có thể thu được bằng cách sử dụng lệnh git-log:

git log -1 HEAD --pretty=format:%s 

như vậy, kịch bản của tôi sẽ là:

#!/bin/bash 

MESSAGE=$(git log -1 HEAD --pretty=format:%s) 

if [[ "$MESSAGE" == *\[email\]* ]]; then 
     echo "do action here" 
else 
     echo "do nothing" 
fi 

Tôi hy vọng điều này có thể giúp bất kỳ ai khác đang tìm kiếm câu trả lời.

+0

Vì vậy, đánh dấu '[email]' này sẽ vĩnh viễn là một phần của thông điệp cam kết của bạn? – Cascabel

+0

Các phương pháp có thể khác: sử dụng biến môi trường để báo hiệu móc nối, vì vậy không bao giờ có bất cứ điều gì trong thông điệp cam kết về nó. Sử dụng bí danh để làm điều này dễ dàng hơn. Hoặc, nếu bạn muốn viết nó trong tin nhắn, phát hiện đánh dấu trong một móc trước khi cam kết, do đó bạn có thể sửa đổi tin nhắn trước khi cam kết được ghi lại. (Hoặc giả sử cam kết sẽ thành công và gửi email ngay lập tức, hoặc lưu trữ một cái gì đó cho móc hậu cam kết để khóa ...) – Cascabel

+0

Hoặc bạn có thực sự làm việc này sau khi nhận, không đăng cam kết? Sau đó, bạn tất nhiên không thể sửa đổi thông báo cam kết nữa. Tuy nhiên, điều đó có nghĩa là giải pháp của bạn không hoạt động: một push không chỉ đẩy một cam kết, nó cập nhật bất kỳ số lượng refs, mỗi trong số đó có thể bao gồm bất kỳ số lượng các cam kết mới. Bạn thực sự nên xem [ví dụ] (http://git.kernel.org/?p=git/git.git;a=blob;f=contrib/hooks/post-receive-email;hb=HEAD) trong git của contrib. Nó xử lý khá nhiều, và bạn có thể sửa đổi nó để chỉ chú ý đến các cam kết nói '[email]'. – Cascabel

1

Bạn có thể muốn một git hook cho rằng

+0

Tôi đã sử dụng móc hậu nhận; Tôi sử dụng biến nào trong tập lệnh bash của mình hoặc tốt hơn, bạn có thể chỉ cho tôi tham chiếu hoặc ví dụ có thể cho tôi biết nên sử dụng biến nào để tôi có thể phân tích cú pháp không? –

+2

Để thuận tiện cho bạn, tôi sẽ đăng văn bản từ liên kết Pablo đã gửi cho bạn ở đây: "Sau khi hoàn tất quá trình cam kết, hook hậu cam kết chạy. Nó không có bất kỳ tham số nào, nhưng bạn có thể dễ dàng có được cam kết bằng cách chạy git log -1 HEAD. Nói chung, tập lệnh này được sử dụng để thông báo hoặc một cái gì đó tương tự. " – Dustin

+0

Để câu trả lời thực sự hữu ích, nó phải chứa ít nhất đủ nhận xét trên để có thể tự đứng vững. – tripleee

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