2010-08-10 2 views
6

trac에 git를 사용하고 있습니다. 내가이 일을 할 수 할 푸시 후 : 특별한 문구에서 ("# 1 참조"와 같은) 커밋 메시지가있는 경우여러 명령이 git post-receive에서 작동하지 않습니다.

  1. 이 사랑하는
  2. 와 개발 팀에 이메일 보내기, 그때는 커밋 메시지를 원하는 trac 티켓에 넣을 수 있습니다.

먼저 git-commit-notifier가 해결합니다. http://trac-hacks.org/wiki/GitPlugin#post-receivehookscripts에서 discribed로

 
#!/bin/sh 

/var/lib/gems/1.8/bin/git-commit-notifier /etc/git-commit-notifier.yml 

내 두 번째 요구 사항이 해결 될 수있다 : 그것은 내가 만든 후 훅을 포스트 - 수신 완벽하게 작동합니다. 또한 이러한 후 수신 후크와 완벽하게 작동합니다.

 
#!/bin/sh 

/var/trac/testgit/commit-updater 

둘 모두 분리되어 있으면 작동합니다. 하지만 그들을 결합해야합니다. 그래서 후 수신 후크를 만들었습니다 :

 
#!/bin/sh 

/var/trac/testgit/commit-updater 
/var/lib/gems/1.8/bin/git-commit-notifier /etc/git-commit-notifier.yml 

매우 재미 있지만 작동하지 않습니다. 명령은 별도로 실행될 때 완벽하게 실행되지만 포스트 후크 후크에 배치 될 때 첫 번째 명령 만 작동합니다. 나는 그런 후크가있는 경우

:

 
#!/bin/sh 

/var/trac/testgit/commit-updater 
/var/lib/gems/1.8/bin/git-commit-notifier /etc/git-commit-notifier.yml 

을 나는 다음과 같은 오류가 발생 할

 
/var/lib/gems/1.8/gems/git-commit-notifier-0.8.0/bin/git-commit-notifier:12: undefined method `strip' for nil:NilClass (NoMethodError) 
     from /var/lib/gems/1.8/bin/git-commit-notifier:19:in `load' 
     from /var/lib/gems/1.8/bin/git-commit-notifier:19 

하지만이 두 명령의 순서를 변경하면 나는 어떤 오류가 발생하지 않지만 단지 첫 번째 명령이 작동합니다.

어떤 도움을 주셔서 감사합니다. 나는이 문제를 오랫동안 해결하려고 노력하고 있으며 아이디어가 없습니다.

#!/bin/sh 

FILE=`mktemp` 
cat - > $FILE 
cat $FILE | /var/trac/testgit/commit-updater 
cat $FILE | /var/lib/gems/1.8/bin/git-commit-notifier /etc/git-commit-notifier.yml 
rm $FILE 
+0

@bessarabov : STDIN에서 읽으려고하는 것처럼 보이지만, 첫 줄이 모든 것을 읽었을 수는 없습니다. – ngoozeff

+0

ngoozeff가 맞다면 stdout을 임시 파일로 복사 한 다음 그 임시 파일을 두 개의 명령 각각으로 리디렉션하십시오. – bstpierre

+0

@ngoozeff 감사합니다. 귀하의 제안은 100 % 정확합니다. =) @bstpierre 덕분에 모든 것이 지금 작동 중입니다! – bessarabov

답변

5
내 댓글을 가정하면 올

commit-updaterstdin을 모두 먹고,이 트릭을 할해야합니다. 처음에는 후크 중 하나가 실패하면 스크립트가 실패합니다. 두 번째로, 일부 후크는 인수를 기대할 수 있습니다. 제 경우에는 gitzilla 갈고리가 그랬습니다.

나를 위해이 gitzilla 및 gitolite 후크를 결합하는 일을 다음

#!/bin/sh 

FILE=`mktemp` 
cat - > $FILE 
cat $FILE | $GIT_DIR/hooks/update.gitzilla $* || exit 1 
cat $FILE | $GIT_DIR/hooks/update.gitolite $* || exit 1 
rm $FILE 

참고 $ *와 출구 문. $ GIT_DIR 변수를 사용할 수도 있습니다. update.gitzilla 및 update.gitolite 파일은 심볼 링크입니다.

+0

고마워요! 귀하의 스크립트에서 내가 바꿔야 할 유일한 것은 따옴표를 제거하는 것입니다 : FILE = mktemp 그리고 그 후에는 완벽하게 작동합니다.) – bessarabov

+0

@bessarabov : 백틱을 제거했습니다. 덕분에 – ngoozeff

+3

백틱이 필요합니다. 그렇지 않으면 "mktemp"가 파일 이름으로 나타납니다. – cweiske

1

내가 ngoozeff의 솔루션이 유용하다고,하지만 몇 가지 추가했습니다 :

1

파일을 사용하는 대신은 다음과 같습니다

#!/bin/sh 

while read oldrev newrev refname 
do 
    echo $oldrev $newrev $refname | /var/trac/testgit/commit-updater 
    echo $oldrev $newrev $refname | /var/lib/gems/1.8/bin/git-commit-notifier /etc/git-commit-notifier.yml 
done 

출처 : 입력 데이터가 모두 큰 아니기 때문에 http://mmm.beachtemple.com/blog/2009/04/06/git-post-receive-hook/

+0

메일과 같이 잘 작동하지 않습니다./usr/share/git-core/contrib/hooks/post-receive-email을 호출합니다. 각 프로세스마다 새로운 프로세스가 생성되어 많은 수의 전자 메일을 생성 할 수 있기 때문입니다. –

0

, 임시 파일없이 가서 쉘의 데이터를 유지할 수 있습니다 :

#!/bin/sh 

refs=$(cat) 
/var/trac/testgit/commit-updater <<END 
$refs 
END 
/var/lib/gems/1.8/bin/git-commit-notifier /etc/git-commit-notifier.yml <<END 
$refs 
END