prosource

Git 후크를 저장소에 삽입

probook 2023. 5. 23. 22:01
반응형

Git 후크를 저장소에 삽입

나쁜 관행으로 간주됩니까? - 말하자면..git/hooks프로젝트 저장소로 이동합니다(예: 심볼릭 링크 사용).그렇다면 다른 Git 사용자에게 동일한 후크를 제공하는 가장 좋은 방법은 무엇입니까?

저는 일반적으로 Scy의 의견에 동의합니다. 몇 가지 추가적인 제안을 포함하면 별도의 답변을 할 가치가 충분히 있습니다.

먼저 적절한 심볼 링크를 생성하는 스크립트를 작성해야 합니다. 특히 이러한 링크가 정책을 시행하거나 유용한 알림을 생성하는 경우에는 더욱 그렇습니다.사람들이 그냥 입력할 수 있다면 후크를 사용할 가능성이 훨씬 더 높을 것입니다.bin/create-hook-symlinks그들이 직접 해야 하는 경우보다.

둘째, 후크를 직접 연결하면 사용자가 자신의 개인 후크를 추가할 수 없습니다.예를 들어, 공백 오류가 없는지 확인하는 샘플 사전 커밋 후크가 더 좋습니다.이 문제를 해결하는 좋은 방법은 저장소에 있는 후크 래퍼 스크립트를 삭제하고 모든 후크를 저장소에 연결하는 것입니다.

그러면 포장지가 검사할 수 있습니다.$0(Bash 스크립트라고 가정합니다. 유사한 것입니다.argv[0]그렇지 않은 경우)를 선택하여 호출된 후크를 확인한 다음 저장소 내의 적절한 후크와 이름을 변경해야 하는 적절한 사용자의 후크를 호출하여 모든 인수를 각 사용자에게 전달합니다.간단한 예:

#!/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모든 알려진 후크 이름을 위 스크립트에 연결합니다.

#!/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

오늘날 당신은 버전 제어 하에 있는 디렉토리를 당신의 Githooks 디렉토리로 설정하기 위해 다음과 같은 일을 할 수 있습니다.MY_REPO_DIR/.githooks 것입니다.

git config --local core.hooksPath .githooks/

여전히 직접 시행할 수는 없지만 README(또는 기타)에 메모를 추가할 경우 각 개발자의 노력을 최소화해야 합니다.

아니요, 저장소에 저장하는 것은 괜찮습니다.저는 심지어 그렇게 하는 것을 제안하고 싶습니다(다른 사람들에게도 유용하다면).사용자는 명시적으로 활성화해야 합니다(예: 심볼릭 링크를 통해 활성화해야 함). 이는 한편으로는 다소 고통스럽지만, 다른 한편으로는 사용자가 동의 없이 임의 코드를 실행하는 것으로부터 사용자를 보호합니다.

프로젝트에 저장하고 빌드에 설치

다른 사람들이 답변에서 언급했듯이, 당신의 훅이 특정 프로젝트에 특정된다면, 그것들을 Git에 의해 관리되는 프로젝트 자체에 포함시키세요.한 단계 더 나아가 단일 스크립트나 명령을 사용하여 프로젝트를 빌드하는 것이 좋은 관행이므로 빌드하는 동안 후크를 설치해야 합니다.

만약 당신이 이것에 대해 조금 더 자세히 읽는 것에 관심이 있다면, 나는 Githooks를 관리하는 것에 관한 기사를 썼습니다.

자바 & 메이븐

완전한 면책 성명; 아래에 설명된 메이븐 플러그인을 작성했습니다.

Java 프로젝트에 대해 Maven을 사용하여 빌드 관리를 처리하는 경우 다음 Maven 플러그인은 프로젝트의 위치에서 후크 설치를 처리합니다.

https://github.com/rudikershaw/git-build-hook

Git ▁your▁in▁put다▁all,▁in니합▁your구성▁a모를 구성합니다.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

NPM의 경우 자바스크립트로 작성된 후크를 포함하여 후크를 설치할 수 있는 허스키라는 종속성이 있습니다.

// package.json
{
  "husky": {
    "hooks": {
      "pre-commit": "npm test",
      "pre-push": "npm test",
      "...": "..."
    }
  }
}

다른이들

또한 Python 프로젝트에 대한 사전 커밋, Ruby 프로젝트에 대한 오버 커밋, Ruby 또는 Node.js 프로젝트에 대한 Lefthook 등 다양한 후크 관리 애플리케이션/플러그인이 있습니다.

TEMPLATE DIRECTORY에서 다음 메커니즘 중 하나를 사용하여 새로 생성된 각 Git 저장소의 .git/hooks 디렉터리를 업데이트할 수 있습니다.

템플릿 디렉터리에는 $GIT_DIR이 생성된 후 복사될 파일 및 디렉터리가 포함됩니다.

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

  • --discovery 옵션과 함께 제공된 인수

  • $GIT_TEMPLATE_DIR 환경변수의 내용

  • init.templateDir 구성 변수 또는

  • 기본 템플릿 디렉토리: /usr/share/git-core/dll.

PHP Composer 기반의 PHP 프로젝트의 경우 엔지니어에게 자동으로 배포할 수 있습니다.다음은 사전 커밋 및 커밋 메시지 후크의 예입니다.

작성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정기적으로

사전 커밋 npm 패키지는 이를 우아하게 처리하므로 패키지에서 사전 커밋 후크를 지정할 수 있습니다.json 파일.

여기 add-git-hook.sh 라는 스크립트가 있습니다. 이 스크립트는 저장소에서 일반 파일로 발송할 수 있으며 Githook을 스크립트 파일에 추가하기 위해 실행할 수 있습니다.사용할 후크(사전 커밋, 사후 커밋, 사전 푸시 등)와 카테터 문서의 후크 정의를 조정합니다.

#!/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

이 스크립트는 실행 권한이 있거나 사용자가 직접 실행할 수 있습니다.이를 사용하여 커밋한 후 다른 컴퓨터를 자동으로 끌어 올렸습니다.

저는 OP가 찾고 있는 것도 아닌 질문에 더 쉽게 대답했습니다.저는 아래 댓글에서 외부에서 후크 스크립트를 관리하는 것보다 저장소에서 후크 스크립트를 배송하는 것에 대한 사용 사례와 인수에 대해 의견을 냈습니다.

적어도 파이썬 생태계에서 사전 커밋을 사용하는 경우에는 많은 게시물이 구식인 것 같습니다(+ 나는 깃 훅 경로를 변경하는 것이 약간 이전 버전의 깃에서 실패한다는 것을 발견했습니다(예: 2.3).repo 루트에 있는 hooksdir에 .pre-commit-config.yaml을 사용하면 가장 쉬운 솔루션은 다음을 실행하는 것입니다.

pre-commit install -f --config hooks/.pre-commit-config.yaml

사전 커밋과 같은 사전 커밋 후크 관리에 관리 솔루션을 사용할 수 있습니다.또는 Datree.io 과 같은 서버측 깃스웨터를 위한 중앙 집중식 솔루션입니다.

다음과 같은 기본 제공 정책이 있습니다.

  1. 비밀의 병합을 탐지하고 방지합니다.
  2. 올바른 Git 사용자 구성을 적용합니다.
  3. Jira 티켓 통합 시행 - 꺼내기 요청 이름/커밋 메시지에서 티켓 번호를 언급합니다.

모든 후크를 대체할 수는 없지만 모든 개발자의 컴퓨터/저장소에 후크를 설치하는 구성이 없어도 가장 확실한 후크를 사용하는 개발자에게 도움이 될 수 있습니다.

고지 사항:저는 데이트리의 창립자 중 한 명입니다.

언급URL : https://stackoverflow.com/questions/3462955/putting-git-hooks-into-a-repository

반응형