답변:
나는 일반적으로 Scytale에 동의하고 별도의 답변을 할 가치가있는 몇 가지 추가 제안을합니다.
먼저, 적절한 후크를 생성하는 스크립트를 작성해야합니다. 특히 이러한 후크가 정책을 시행하거나 유용한 알림을 생성하는 것과 관련이있는 경우입니다. 사람들은 bin/create-hook-symlinks
스스로해야하는 것보다 타이핑 할 수 있다면 후크를 훨씬 더 많이 사용할 것입니다.
둘째, 직접 연결 고리는 사용자가 자신의 개인 고리를 추가하지 못하게합니다. 예를 들어 샘플 프리 커밋 후크를 선호하므로 공백 오류가 없어야합니다. 이 문제를 해결하는 가장 좋은 방법은 리포지토리에 후크 래퍼 스크립트를 넣고 모든 후크를 심볼릭 링크 하는 것입니다. 그런 다음 래퍼는 $0
(bash 스크립트이고 다른 것과 동등한 것으로 가정 argv[0]
) 호출 된 후크를 파악한 다음 repo 내에서 적절한 후크를 호출하고 적절한 사용자 후크를 호출하여 이름을 바꿔야합니다. 모든 인수를 각각에 전달합니다. 메모리의 빠른 예 :
#!/bin/bash
if [ -x $0.local ]; then
$0.local "$@" || exit $?
fi
if [ -x tracked_hooks/$(basename $0) ]; then
tracked_hooks/$(basename $0) "$@" || exit $?
fi
설치 스크립트는 기존의 모든 후크를 측면으로 옮기고 ( .local
이름에 추가 ) 알려진 모든 후크 이름을 위 스크립트로 symlink합니다.
#!/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
HOOK_DIR=$(git rev-parse --show-toplevel)/.git/hooks
입니다.
아니요, 저장소에 넣는 것이 좋습니다. 다른 사람들에게도 유용한 경우 제안하는 것이 좋습니다. 사용자는 명시 적으로 활성화해야합니다 (예 : 심볼릭 링크로 말하면). 이는 약간의 고통이지만 다른 한편으로는 사용자가 동의없이 임의 코드를 실행하지 못하게합니다.
요즘에는 버전 제어를받는 디렉토리를 git hooks 디렉토리로 설정하기 위해 다음을 수행 할 수 MY_REPO_DIR/.githooks
있습니다.
git config --local core.hooksPath .githooks/
여전히 직접적으로 시행 할 수는 없지만 README (또는 무엇이든)에 메모를 추가하면 각 개발자가 최소한의 노력을 기울여야합니다.
에서 http://git-scm.com/docs/git-init#_template_directory , 당신은 / 각 새로 생성 된 자식의 repo의 디렉토리 잇는 .git를 업데이트 이러한 메커니즘 중 하나를 사용할 수 있습니다 :
템플리트 디렉토리에는 파일 및 디렉토리가 작성된 후 $ GIT_DIR에 복사 될 디렉토리가 있습니다.
템플릿 디렉토리는 다음 중 하나입니다 (순서대로).
--template 옵션으로 주어진 인수;
$ GIT_TEMPLATE_DIR 환경 변수의 내용;
init.templateDir 구성 변수; 또는
기본 템플릿 디렉토리 : / usr / share / git-core / templates
다른 사람들이 답변에서 언급했듯이 후크가 특정 프로젝트에 고유 한 경우 git이 관리하는 프로젝트 자체에 후크를 포함시킵니다. 나는 이것을 더 나아가서 하나의 스크립트 또는 명령을 사용하여 프로젝트를 빌드하는 것이 좋으면 빌드 중에 후크를 설치해야한다고 말하고 싶습니다.
좀 더 깊이 이해하려면 git hooks 관리에 대한 기사를 썼습니다 .
면책 조항 아래에 설명 된 Maven 플러그인을 작성했습니다.
Java 프로젝트 용 Maven으로 빌드 관리를 처리하는 경우 다음 Maven 플러그인은 프로젝트의 위치에서 후크 설치를 처리합니다.
https://github.com/rudikershaw/git-build-hook
모든 Git 후크를 프로젝트의 디렉토리에 넣은 후 pom.xml
다음 플러그인 선언, 목표 및 구성을 포함하도록 구성하십시오.
<build>
<plugins>
<plugin>
<groupId>com.rudikershaw.gitbuildhook</groupId>
<artifactId>git-build-hook-maven-plugin</artifactId>
<configuration>
<gitConfig>
<!-- The location of the directory you are using to store the Git hooks in your project. -->
<core.hooksPath>hooks-directory/</core.hooksPath>
</gitConfig>
</configuration>
<executions>
<execution>
<goals>
<!-- Sets git config specified under configuration > gitConfig. -->
<goal>configure</goal>
</goals>
</execution>
</executions>
</plugin>
<!-- ... etc ... -->
</plugins>
</build>
프로젝트 빌드를 실행할 때 플러그인은 지정된 디렉토리에서 후크를 실행하도록 git을 구성합니다. 이렇게하면 프로젝트에서 작업하는 모든 사람을 위해 해당 디렉토리에 후크를 효과적으로 설정할 수 있습니다.
NPM의 경우 Husky 라는 종속성 이 있으므로 JavaScript로 작성된 후크를 포함하여 후크를 설치할 수 있습니다.
// package.json
{
"husky": {
"hooks": {
"pre-commit": "npm test",
"pre-push": "npm test",
"...": "..."
}
}
}
또한 Python 프로젝트에 대한 사전 커밋 , Ruby 프로젝트에 대한 오버 커밋 및 Ruby 또는 노드 프로젝트에 대한 Lefthook 이 있습니다.
https://www.npmjs.com/package/pre-commit 이 우아하게 당신이 지정할 수 NPM 패키지 핸들 당신의 package.json에 후크를 사전은 커밋.
Composer 기반 PHP 프로젝트의 경우 엔지니어에게 자동으로 배포 할 수 있습니다. 사전 커미트 및 commit-msg 후크에 대한 예는 다음과 같습니다.
hooks
composer.json에 폴더를 작성하십시오 .
},
"scripts": {
"post-install-cmd": [
"cp -r 'hooks/' '.git/hooks/'",
"php -r \"copy('hooks/pre-commit', '.git/hooks/pre-commit');\"",
"php -r \"copy('hooks/commit-msg', '.git/hooks/commit-msg');\"",
"php -r \"chmod('.git/hooks/pre-commit', 0777);\"",
"php -r \"chmod('.git/hooks/commit-msg', 0777);\"",
],
그런 다음 모든 사람이 composer install
정기적으로 실행되면서 프로젝트가 계속됨에 따라 업데이트 할 수도 있습니다 .
다음은 add-git-hook.sh 스크립트입니다.이 스크립트는 리포지토리에 일반 파일로 제공 될 수 있으며 스크립트 파일에 git hook을 추가하기 위해 실행될 수 있습니다. 사용할 후크 (사전 커밋, 사후 커밋, 사전 푸시 등)와 고양이 heredoc에서 후크 정의를 조정하십시오.
#!/usr/bin/bash
# Adds the git-hook described below. Appends to the hook file
# if it already exists or creates the file if it does not.
# Note: CWD must be inside target repository
HOOK_DIR=$(git rev-parse --show-toplevel)/.git/hooks
HOOK_FILE="$HOOK_DIR"/post-commit
# Create script file if doesn't exist
if [ ! -e "$HOOK_FILE" ] ; then
echo '#!/usr/bin/bash' >> "$HOOK_FILE"
chmod 700 "$HOOK_FILE"
fi
# Append hook code into script
cat >> "$HOOK_FILE" <<EOF
########################################
# ... post-commit hook script here ... #
########################################
EOF
이 스크립트는 실행 권한이 있거나 사용자가 직접 실행할 수 있습니다. 나는 이것을 사용하여 다른 컴퓨터에서 자동으로 git-pull을 사용했습니다.
편집-나는 묻지 않았고 OP가 찾고있는 것이 아닌 쉬운 질문에 대답했습니다. 아래 주석에서 외부 스크립트를 관리하는 것보다 repo에서 후크 스크립트를 배송하는 유스 케이스 및 인수에 동의했습니다. 그것이 당신이 찾고있는 것보다 많기를 바랍니다.
pre-commit과 같은 pre-commit hook 관리를 위해 관리 형 솔루션을 사용할 수 있습니다 . 또는 Datree.io 와 같은 서버 측 git-hook에 대한 중앙 집중식 솔루션 . 다음과 같은 기본 제공 정책이 있습니다.
모든 후크를 대체하지는 않지만 모든 개발자 컴퓨터 / 리포지토리에 후크를 설치하지 않고도 구성이 가장 분명한 개발자에게 도움이 될 수 있습니다.
면책 조항 : 저는 Datrees 설립자 중 하나입니다
chmod +x .git/hooks/*
당신의bin/create-hook-symlinks
일에 추가 했습니다.