2011-04-28 3 views
17

그래서 내 분기는 "issue-1234"와 같은 bugtracker 티켓 번호의 이름을 따서 명명되며 커밋 메시지에 항상 티켓 번호를 적는 규칙이 있습니다. 명시 적으로 타이핑하지 않고 issue- * branch에서 작업 할 때 커밋 메시지에 티켓 번호를 자동으로 추가 할 수 있는지 궁금합니다.git commit hooks를 사용하여 티켓 번호를 추가 하시겠습니까?

전 git commit 후크, 즉 pre-commit, prepare-message 및 post-commit을 보았습니다. 그 중 아무 것도 내가 원하는 것을 수행 할 수없는 것 같습니다. 포스트 커밋 (post-commit) 훅은 가까워 지지만 -m을 사용하여 커밋 된 메시지는 수정할 수 없습니다.

다음은, 자식 로그에,이 같은 메시지를 보여줍니다 커밋 후 문제-1234

git commit -a -m"fixed this pesky issue" 

:

분기에

이 가능한 경우

, 나는 궁금하네요을 유지하려면
fixed this pesky issue. ticket number: #1234 

답변

16

후크를 놓쳤습니다. 원하는 사용자가 commit-msg :

이 후크는 git commit에 의해 호출되며 --no-verify 옵션으로 건너 뛸 수 있습니다. 제안 된 커밋 로그 메시지를 보유하고있는 파일의 이름 인 단일 매개 변수를 사용합니다. 0이 아닌 상태로 종료하면 git commit이 중단됩니다. 그래서 예를 들면

:

지사 이름의 매우 순진 구문 분석, 그리고 그것은 단순히 한 줄에 커밋 메시지에 추가 것
#!/bin/sh 

ticket=$(git symbolic-ref HEAD | awk -F- '/^issue-/ {print $2}') 
if [ -n "$ticket" ]; then 
    echo "ticket #$ticket" >> $1 
fi 

. 충분하지 않은 경우 수정하십시오.

물론 실제로는 prepare-commit-msg에서이 작업을 수행하고 git commit (-m 제외)으로 처리하는 것이 좋습니다. 한 줄의 커밋 메시지에 충분한 정보를 실제로 작성할 수 있다는 것은 매우 드뭅니다. 또한, 커밋이 이루어지기 전에 메시지를 볼 수있게 해줄 것입니다.

+0

+1 단순하고 작업을 수행합니다. 그냥 해야하는 방법 :) – ralphtheninja

+0

+1. 파일에서 여러 줄의 주석을 리다이렉트하면,'git commit --file = myMultiLineCommentFile'을 실행해도 여전히'commit-msg'hook을 사용할 수 있습니다. – VonC

+0

@VonC :'commit-msg' 후크는 완전 자동 병합 커밋을 제외하고 커밋이 발생할 때마다 발생합니다 (즉, 충돌이없고'--no-commit'이 아닙니다). 그것은 OP를위한 문제가 아니어야한다. (이것은 약간의 버그/감독이다.) 최근에 그들은 자동 병합을위한'prepare-commit-msg' 훅에 대한 지원을 추가했으나'post-commit'과'commit-msg'가 여전히 없다고 생각한다.) – Cascabel

2

다른 옵션은 git notes을 사용하여 언급 한 후크 중 하나를 사용하여 티켓 번호 정보를 커밋에 추가하는 것입니다.
(메모 메커니즘에 대한 자세한 내용은 블로그 게시물 항목 "Notes to self"을 참조하십시오.)

+0

후크의 문제점은 이미 -m과 함께 커밋 메시지를 제공하면 실제로 작동하지 않는다는 것입니다. prepare-commit-message hook은 외부 편집기가 실행될 때만 작동합니다. – EnToutCas

+0

@EnToutCas : 커밋 메시지가'-m'을 통해 지정되었을 때 커밋을 실행할 때 전혀 후크가 없다는 것을 의미합니까? – VonC

+0

+1 VonC의 경우에도 마찬가지입니다. 매일 새로운 지식을 쌓을 수있는 좋은 느낌입니다. Stackoverflow 바위와 그것을 그렇게 stackoverflow의 사람들. – ralphtheninja

4

또한 commit-msg보다 많은 매개 변수를 사용할 수있는 prepare-commit-msg 후크를 사용할 수 있습니다. 그런 다음 원하지 않을 때 이슈 번호를 추가하는 것을 피하기 위해 파일, 템플릿 등으로부터 메시지가 왔는지 확인할 수 있습니다.

foo-123이라는 기능 분기에서 작업 할 때 .git/hooks/prepare-commit-msg에있는 다음 스크립트를 사용하면 모든 커밋의 세 번째 줄에 [#123]이 추가됩니다.

More information in this post I wrote

#!/bin/sh 

if [ x = x${2} ]; then 
    BRANCH_NAME=$(git symbolic-ref --short HEAD) 
    STORY_NUMBER=$(echo $BRANCH_NAME | sed -n 's/.*-\([0-9]\)/\1/p') 
    if [ x != x${STORY_NUMBER} ]; then 
    sed -i.back "1s/^/\n\n[#$STORY_NUMBER]/" "$1" 
    fi 
fi 
2

당신이 메시지를 커밋의 시작 지점 이름을 추가 할 수 있습니다이 방법. 그것은 prepare-commit-msg hook입니다. "git commit -m"및 "git commit"명령 모두에 대해 작업하십시오. 옵션은 .git/hooks/pre-commit 파일입니다.자동 건너 뛰기를 원하지 않는 가지 목록이 포함 된 건너 뛰기.

BRANCH="$(git rev-parse --abbrev-ref HEAD)" 
FILE_CONTENT="$(cat $1)" 
skip_list=`git rev-parse --git-dir`"/hooks/pre-commit.skip" 
if grep -E "^$BRANCH$" $skip_list; then 
    exit 
fi 
if [ $2 = "message" ]; then 
    echo $BRANCH: $FILE_CONTENT > $1 
else 
    echo $BRANCH: > $1 
    echo $FILE_CONTENT >> $1 
fi 
관련 문제