2011-02-02 5 views
9

전 자식에게 익숙하고 원본/마스터로 푸시 한 후 커밋 메시지를 캡처하고 (서버에서) 서버 기반의 bash 스크립트를 실행할 수 있기를 원합니다. 문자열에 무엇이 들어 있는지.자식 커밋 메시지를 캡처하고 작업을 실행하는 방법

예를 들어, 내 자식이 커밋 메시지를 경우 말한다 : [email] my commit message

커밋 메시지가 [email] 다음 지정된 동작을 포함하는 경우, 그렇지 않으면하지 않습니다. 기본적으로 내가 알아야 할 모든 위의 bash는 사용, 커밋 메시지에 대한 변수 이름은 무엇

#!/bin/bash 

MESSAGE= #commit message variable? 

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

: 여기

내가 post-receive 후크 사용하여 생각하고 샘플 bash는 스크립트입니다 스크립트? 또한, 이것이 올바른 일인지 아닌지 확실하지 않습니다.

답변

24

에 대한 git hook합니다; 변수는 git-log 명령을 사용하여 얻을 수 있습니다

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

그래서, 내 스크립트는 다음과 같습니다
#!/bin/bash 

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

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

내가이 다른 사람 해답를 검색하는 사람들을 도울 수 있기를 바랍니다.

+0

이'[email]'마크 업은 커밋 메시지에 영구히 포함될 것입니까? – Cascabel

+0

다른 가능한 방법 : 환경 변수를 사용하여 후크에 신호를 보내십시오. 따라서 커밋 메시지에 아무 것도 없습니다. 앨리어스를 사용하면이 작업을보다 쉽게 ​​수행 할 수 있습니다. 또는 메시지에 기록하려면 커밋 전 훅 (pre-commit hook)에서 마크 업을 감지하여 커밋이 기록되기 전에 메시지를 수정할 수 있습니다. (커밋이 성공하고 즉시 이메일을 보내거나, 포스트 커밋 훅을위한 무언가를 키에 저장한다고 가정합니다 ...) – Cascabel

+0

아니면 정말로이 포스트 - 수신을하고 있습니까, 커밋하지 않았습니까? 그런 다음 커밋 메시지를 더 이상 수정할 수 없습니다. 그러나 이는 솔루션이 작동하지 않는다는 것을 의미합니다. 푸시는 한 커밋을 푸시하지 않고 모든 수의 새로운 커밋을 포함 할 수있는 모든 수의 참조를 업데이트합니다. 실제로 [예제] (http://git.kernel.org/?p=git/git.git;a=blob;f=contrib/hooks/post-receive-email;hb=HEAD)를 참고하십시오. 자식의 기여. 그것은 꽤 많이 처리하고'[email]'라고하는 커밋에만주의를 기울여 수정할 수 있습니다. – Cascabel

1

당신은 아마 내가 내 자신의 질문에 대한 답을 알아 냈다고 생각

+0

나는 이미 수신 후 후크를 사용하고 있습니다. 어떤 변수를 bash 스크립트에서 사용할 것인가? 아니면 더 나은 방법인지, 나에게 구문 분석 할 수 있도록 사용법을 알려주는 참조 나 예제를 가르쳐 주시겠습니까? –

+2

편의를 위해 Pablo가 보낸 링크의 텍스트를 게시 할 것입니다. "전체 커밋 프로세스가 완료된 후 커밋 후 후크가 실행됩니다. 매개 변수는 필요하지 않지만 마지막 커밋 git log -1 HEAD를 실행하여 커밋하십시오. 일반적으로이 스크립트는 알림 또는 이와 유사한 용도로 사용됩니다. " – Dustin

+0

실제로 도움이 될만한 대답은 합리적인 근거를 제시 할 수있을만큼 위의 내용을 담고 있어야합니다. – tripleee

관련 문제