programing

Githook 스크립트를 저장소와 함께 관리할 수 있습니까?

stoneblock 2023. 5. 24. 21:39

Githook 스크립트를 저장소와 함께 관리할 수 있습니까?

우리는 우리 모두가 공유할 수 있는 몇 가지 기본적인 후크 스크립트를 만들고 싶습니다. 커밋 메시지를 미리 포맷하는 것과 같은 것들입니다.Git에는 일반적으로 다음에 저장되는 후크 스크립트가 있습니다.<project>/.git/hooks/그러나 이러한 스크립트는 사용자가 복제를 수행할 때 전파되지 않으며 버전이 제어되지 않습니다.

모든 사람이 올바른 후크 스크립트를 얻을 수 있도록 도와주는 좋은 방법이 있습니까?내 보고서에서 해당 후크 스크립트가 버전 제어 스크립트를 가리키도록 할 수 있습니까?

Git 2.9에서 구성 옵션은 사용자 정의 후크 디렉터리를 지정합니다.

를 크를이니다합동후로 합니다.hooks추적된 디렉터리가 저장소에 있습니다.그런 다음 추적된 데이터를 사용하도록 리포지토리의 각 인스턴스를 구성합니다.hooks$GIT_DIR/hooks:

git config core.hooksPath hooks

일반적으로 경로는 절대 경로이거나 후크가 실행되는 디렉터리(일반적으로 작업 트리 루트, 의 설명 섹션 참조)에 상대 경로일 수 있습니다.

이론적으로, 당신은 다음을 만들 수 있습니다.hooks프로젝트 디렉토리에 있는 디렉토리(또는 원하는 이름)와 모든 스크립트를 연결합니다..git/hooks물론 레포를 복제한 각 사용자는 이러한 심볼릭 링크를 설정해야 합니다(단, 복제자가 이러한 심볼릭 링크를 반자동으로 설정하기 위해 실행할 수 있는 배포 스크립트를 사용할 수도 있습니다).

*nix에서 심볼릭 링크를 수행하려면 다음과 같이 하면 됩니다.

root="$(pwd)"
ln -s "$root/hooks" "$root/.git/hooks"

사용하다ln -sf내을덮준어되경있우는에 있는가 되어 .git/hooks

Node.js 사용자의 경우 패키지를 업데이트하는 것이 간단한 솔루션입니다.와의 관계.

{
  "name": "name",
  "version": "0.0.1",
  ......
  "scripts": {
    "preinstall": "git config core.hooksPath hooks",

사전 설치가 다음 이전에 실행됩니다.

npm 설치

및 Git를 리디렉션하여 내부에서 후크를 찾습니다.\directory(또는 선택한 이름) 디렉토리입니다.이 디렉터리는 파일 이름(.sample 제외) 및 구조 측면에서 .\.git\hooks를 모방해야 합니다.

메이븐과 다른 빌드 도구에 프리 인스톨과 동등한 기능이 있다고 상상해 보십시오.

또한 모든 플랫폼에서 작동해야 합니다.

자세한 내용은 과 깃 후크를 공유하는 두 가지 방법을 참조하십시오.

이 자바스크립트를 사용하는 .npm패키지 관리자로서 공유 후크를 사용하여 깃 후크를 적용할 수 있습니다.npm install.

전체 공개:나는 이 소포를 썼습니다.

저는 여러 개의 답을 하나로 통합하고 싶었습니다.당신이 자신의 몸에 있다고 가정할 때project/디렉터리:

사용자 지정 후크 설정

  1. 를 작성.githooks디렉토리를 지정하고 해당 디렉토리에 후크를 배치합니다. (참조).git/hooks예를 들어)

  2. 성을 합니다..gitconfig디렉토리 ¹을 가리키는 파일:

    git config -f .gitconfig core.hooksPath .githooks
    
  3. 에서 .Makefile²

    enable-git-hooks:
        git config --local include.path ../.gitconfig
        $(warning REMEMBER, YOU MUST HAVE REVIEWED THE CUSTOM HOOKS!)
    

사용자 지정 후크 사용

모든 개발자는 이러한 사용자 지정 후크를 검토한 후 명시적으로 활성화해야 합니다.README에 다음과 같은 지침을 추가합니다.

후크를 한 후 지정 활성화하기make enable-git-hooks.

대부분의 현대 프로그래밍 언어 또는 빌드 도구는 깃 후크를 관리하기 위한 플러그인을 지원합니다.즉, 패키지를 구성하기만 하면 됩니다.json, pom.xml 등의 파일들, 그리고 당신의 팀의 모든 사람들은 빌드 파일을 변경하지 않는 한 따를 수 밖에 없습니다.

플러그인이 컨텐츠를 .git 디렉토리에 추가합니다.

예:

깃 빌드 후크 메이븐 플러그인

기쓰크마인의

기트-바이어스-제이스

빌드 전 및 빌드 후 이벤트가 있는 Visual Studio 솔루션(및 프로젝트)을 사용하고 있습니다.'GitHookDeployer'라는 프로젝트를 추가합니다.프로젝트가 빌드 후 이벤트의 파일을 자체적으로 수정합니다.이 파일은 빌드 디렉터리에 복사하도록 설정되어 있습니다.따라서 프로젝트는 매번 빌드되며 건너뛸 수 없습니다.빌드 이벤트에서는 모든 깃 후크가 제자리에 있는지도 확인합니다.

물론 일부 프로젝트는 구축할 내용이 없기 때문에 일반적인 솔루션은 아닙니다.

후크를 사용합니다.그것은 경로.git/hooks합니다.githooks.

또한 복사 및 심볼릭 링크 후크를 최소화할 수 있는 많은 기능이 있습니다.

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

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

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

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

후크는 샘플 파일을 따르는 경우 Bash로 작성하는 것이 좋습니다.그러나 사용 가능한 모든 언어로 작성할 수 있으며 실행 가능한 플래그가 있는지 확인하십시오.

그래서 당신은 목표를 달성하기 위해 파이썬이나 바둑 코드를 작성하고 후크 폴더 아래에 둘 수 있습니다.작동하지만 리포지토리와 함께 관리되지는 않습니다.

두 가지 옵션

다중 스크립트

도움말 내부에 후크를 코딩하고 후크에 작은 코드 조각을 추가하여 다음과 같이 완벽한 스크립트를 호출할 수 있습니다.

$ cat .git/hooks/pre-commit
#!/bin/bash
../../hooks/myprecommit.js

단일 스크립트

더 좋은 방법은 여러 스크립트 대신 스크립트를 하나만 추가하여 모든 스크립트를 관리하는 것입니다.그래서 hooks/mysuperhook.go 파일을 만들고 원하는 모든 hook을 가리킵니다.

$ cat .git/hooks/pre-commit
#!/bin/bash
../../hooks/mysuperhook.go $(basename $0)

매개 변수는 어떤 후크가 트리거되었는지 스크립트를 제공하며 코드 내에서 구별할 수 있습니다. 왜죠?예를 들어 커밋 및 푸시에 대해 동일한 검사를 실행할 수도 있습니다.

그리고 나서는요?

그런 다음 다음과 같은 추가 기능을 사용할 수 있습니다.

  • 후크를 수동으로 트리거하여 커밋 또는 푸시하기 전에도 모든 것이 정상인지 확인합니다.스크립트(옵션 a 또는 b)만 호출하면 됩니다.
  • CI에 대한 동일한 검사를 다시 작성할 필요가 없도록 CI에 대한 후크를 트리거합니다.예를 들어, 이는 커밋 및 푸시 트리거를 호출하는 것입니다.위와 같은 방법으로 해결해야 합니다.
  • 마크다운 검증자 또는 YAML 검증자와 같은 외부 도구를 호출합니다.시스템 호출을 수행할 수 있으며 표준 출력 및 표준 오류를 처리해야 합니다.
  • 모든 개발자가 후크를 설치할 수 있는 간단한 방법을 가지고 있는지 확인하여 기본 후크를 올바른 후크로 바꾸기 위해 적절한 스크립트를 리포지토리에 추가해야 합니다.
  • 모든 리포지토리에 추가할 필요 없이 분기를 개발하고 마스터하기 위한 커밋을 차단하는 검사와 같은 일부 글로벌 도우미가 있어야 합니다.글로벌 스크립트가 있는 다른 리포지토리를 사용하여 이 문제를 해결할 수 있습니다.

이것이 더 간단할 수 있습니까?

예, Git 후크를 관리하는 데 도움이 되는 몇 가지 도구가 있습니다.이들은 각각 다른 관점에서 문제를 해결할 수 있도록 조정되어 있으며, 여러분은 자신이나 팀에 가장 적합한 문제를 얻기 위해 모든 문제를 이해해야 할 수도 있습니다.GitHooks.com 후크에 대한 많은 정보와 현재 사용 가능한 여러 도구를 제공합니다.

현재 Git 후크를 관리하기 위한 다양한 전략을 가진 21개의 프로젝트가 나열되어 있습니다.어떤 것들은 단일 고리에만, 어떤 것들은 특정 언어에 대해서만 수행합니다.

제가 작성한 오픈 소스 프로젝트로 무료로 제공되는 도구 중 하나는 hooks4git입니다.Python(좋아하기 때문에)으로 작성되지만, 이 아이디어는 저장소 내에 있으며 호출할 스크립트를 원하는 언어로 호출할 수 있는 .hooks4git.ini라는 단일 구성 파일에서 위에 나열된 모든 항목을 처리하는 것입니다.

깃 훅을 사용하는 것은 정말 환상적이지만, 그것들이 제공되는 방식은 보통 사람들을 그것으로부터 멀어지게 할 뿐입니다.

후크 폴더를 다른 Git 저장소로 만들고 하위 모듈로 연결할 수 있습니다.

회원이 많고 훅이 정기적으로 바뀌어야 가치가 있다고 생각합니다.

Gradle 사용자용

저는 이 스크립트들이 Gradle 프로젝트에 매우 유용하다는 을 알았습니다.

빌드.그래들

apply from: rootProject.file('gradle/install-git-hooks.gradle')

그라들/설치-깃-깃-스캐너.그라들

tasks.create(name: 'gitExecutableHooks') {
    doLast {
        Runtime.getRuntime().exec("chmod -R +x .git/hooks/");
    }
}
task installGitHooks(type: Copy) {
    from new File(rootProject.rootDir, 'pre-commit')
    into { new File(rootProject.rootDir, '.git/hooks') }
}
gitExecutableHooks.dependsOn installGitHooks
clean.dependsOn gitExecutableHooks

사전 커밋

.... your pre commit scripts goes here

저는 현재 코드베이스에서 이 문제를 연구하고 있으며, 우연히 이 문제에 관한 라이브러리를 발견했습니다.huskyGitHub Hooks를 팀 전체에서 사용하고 공유하는 방법을 단순화합니다.저는 그것을 조사하는 것을 강력히 추천합니다.

3765910의 Gradle에 대한 답변에서 영감을 얻었지만 모든 빌드를 실행하도록 수정되었습니다.

앱의 build.gradle에 다음 사항을 추가합니다(소스 제어에 보관할 githooks/precommit 파일을 이미 만들었다고 가정합니다).

copy {
    from new File(rootProject.rootDir, 'githooks/pre-commit')
    into { new File(rootProject.rootDir, '.git/hooks') }
}

후크 디렉토리의 버전을 지정하려면(저장 위치를 가정)hooks/), 생성.gitconfig다음 내용을 포함하는 작업 복사본 루트의 파일:

[core]
hooksPath = hooks

오버라이드됩니다..git/config.

언급URL : https://stackoverflow.com/questions/427207/can-git-hook-scripts-be-managed-along-with-the-repository