2010-08-11 5 views
141

프로젝트 저장소에 .git/hooks (예 : 심볼 링크 사용)를 넣는 것은 좋지 않은 것으로 간주됩니까? 그렇다면 동일한 git 사용자에게 동일한 후크를 전달하는 가장 좋은 방법은 무엇입니까?저장소에 git 후크 넣기

답변

74

아니요, 저장소에 저장하는 것은 괜찮습니다. 다른 사람에게도 유용하다면 그렇게하는 것이 좋습니다. 사용자는 명시 적으로 (예를 들어, 심볼릭 링크로 말한 것처럼) 한편으로는 통증을 느끼지 만 다른 사용자는 동의없이 임의의 코드를 실행하지 못하도록 보호해야합니다.

+6

회사 정책 일 경우 코드가 "임의"가 아니므로 이는 필수 코드이므로 GIT에서 제한 사항으로 간주되며 추적되는 다른 (미리 정의 된) 디렉토리가없는 경우, 또한 일반 훅과 함께 실행 됨 –

+8

자동으로 훅을 전달하는 것은 보안상의 문제입니다. Git이 직접 팀/회사 정책을 시행하거나 서버 측에서 훅을 사용하거나 사용자가 수동으로 결정할 수있게 해준 것을 기쁘게 생각합니다. @cy가 설명하는대로 사용 가능하게 설정하십시오. –

+2

"사용자가 동의없이 임의의 코드를 실행하지 못하게합니다". 개발자가 제안한대로 (symlinking)하면 다른 사람이 후크를 변경하고 "동의없이 임의의 코드를 실행" – MiniGod

121

나는 일반적으로 Scytale에 동의하며 몇 가지 추가 제안 사항 만 있으면 충분합니다.

먼저, 특히 이러한 훅이 정책을 적용하거나 유용한 알림을 만드는 것과 관련되어있는 경우 적절한 심볼릭 링크를 만드는 스크립트를 작성해야합니다. 사람들이 직접해야하는 것보다 bin/create-hook-symlinks을 입력하면 갈고리를 사용할 확률이 훨씬 높아집니다.

두 번째로 직접 기호 링크는 사용자가 자신의 개인 후크에 추가 할 수 없게합니다. 예를 들어 필자는 공백 오류가 없는지 미리 확인하는 샘플 프리 훅을 좋아한다. 이 문제를 해결하는 가장 좋은 방법은 repo에 hook wrapper 스크립트를 넣고 심볼릭 링크 에 후크를 끼워 넣는 것입니다. 그러면 래퍼는 $0 (bash 스크립트라고 가정하고 다른 경우는 argv[0]과 같은 의미)을 검사하여 해당 호크가 호출 된 후 해당 호크를 호출하고 적절한 사용자의 후크를 호출 할 수 있습니다. 모든 인수를 각각 전달하여 이름을 바꿀 수 있습니다. 메모리에서 빠른 예 :

#!/bin/bash 
if [ -x $0.local ]; then 
    $0.local "[email protected]" || exit $? 
fi 
if [ -x tracked_hooks/$(basename $0) ]; then 
    tracked_hooks/$(basename $0) "[email protected]" || exit $? 
fi 

설치 스크립트는 위의 스크립트에 알려진 모든 후크 이름을 측면 (자신의 이름을 .local를 추가) 모든 기존의 후크를 이동하고 심볼릭 링크 것이다 :

#!/bin/bash 
HOOK_NAMES="applypatch-msg pre-applypatch post-applypatch pre-commit prepare-commit-msg commit-msg post-commit pre-rebase post-checkout post-merge pre-receive update post-receive post-update pre-auto-gc" 
# assuming the script is in a bin directory, one level into the repo 
HOOK_DIR=$(git rev-parse --show-toplevel)/.git/hooks 

for hook in $HOOK_NAMES; do 
    # If the hook already exists, is executable, and is not a symlink 
    if [ ! -h $HOOK_DIR/$hook -a -x $HOOK_DIR/$hook ]; then 
     mv $HOOK_DIR/$hook $HOOK_DIR/$hook.local 
    fi 
    # create the symlink, overwriting the file if it exists 
    # probably the only way this would happen is if you're using an old version of git 
    # -- back when the sample hooks were not executable, instead of being named ____.sample 
    ln -s -f ../../bin/hooks-wrapper $HOOK_DIR/$hook 
done 
+6

'bin/create-hook-symlinks'에'chmod + x .git/hooks/*'를 추가했습니다. – guneysus

+6

@guneysus 후크는 이미 실행 가능해야하며 (그런 방식으로 검사해야 함) 링크에 특수 권한, 링크 된 파일 만 필요하기 때문에 필요하지 않아야합니다. – Cascabel

+12

후크 디렉토리를 얻는 더 좋은 방법은'HOOK_DIR = $ (git rev-parse --show-toplevel)/.git/hooks'입니다. –

4

템플릿 디렉토리 파일과 직접이 포함 http://git-scm.com/docs/git-init#_template_directory에서

, 각 새로 생성 된 자식의 repo의 .git/후크 디렉토리를 업데이트 이러한 메커니즘 중 하나를 사용할 수 있습니다 ory는 이 생성 된 후 $ GIT_DIR에 복사됩니다.

템플릿 디렉토리 중 하나가 될 것입니다 (순서대로) 다음

  • --template 옵션으로 주어진 인수를;

  • $ GIT_TEMPLATE_DIR 환경 변수의 내용.

  • init.templateDir 구성 변수; 또는

  • 기본 템플릿 디렉토리는/usr/share/git-core/templates입니다.

+5

"이러한 메커니즘 중 하나를 사용할 수는 있지만"하나만 지정하십시오. – Otheus

관련 문제