UFO ET IT

Git 원격 / 공유 사전 커밋 후크

ufoet 2020. 11. 8. 11:38
반응형

Git 원격 / 공유 사전 커밋 후크


하나의 공식 저장소를 원격으로 사용하고 여러 로컬 저장소를 복제하면 해당 주 저장소에서 사전 커밋 후크를 스크립팅하고 모든 복제본에 적용 할 수 있습니까?


후크가 복제되지 않기 때문에 그렇게 생각하지 않습니다.
해당 후크 스크립트가 자체적으로 버전이 지정된 다음 복제 서버의 (기호 링크)에 연결될 수 있습니다 (OS에서 해당 링크 기능을 지원하는 경우).

또는 후크가 클론을 생성하는 데 사용되는 git 템플릿 디렉토리의 일부인 경우 (클론 저장소에 존재하는 것만 보장하므로 실제로 사용되고 실행된다는 보장은 없습니다).

하지만 커밋을 강제하는 "중앙"방법은 없다고 생각합니다.


Jefromi가 주석에서 더 명확하게 설명했듯이 (강조 내) :

리포지토리와 함께 배포 된 후크를 적용하는 것은 git 리포지토리의 아이디어에 정말 위배되는 것 같습니다.
내 복제본은 내 저장소 입니다. 후크를 실행할지 여부를 선택하는 것을 포함하여 원하는대로 git을 사용할 수 있어야합니다.
(보안 관점에서 보면 정말 무섭습니다. 특정 git 명령을 실행할 때마다 특정 스크립트를 강제로 실행할 수있는 사람이 없어야합니다.)

나는 그 의견에 동의하며 주어진 전문 리포지토리에서 로컬로 적용된 규칙을 적용하는 방법만을 보았습니다.
예를 들어, 중앙 저장소로 직접 푸시하지 않고 먼저 특정 규칙을 따르는 경우에만 커밋을 수락하는 QA 저장소로 푸시합니다. 그렇다면 QA 저장소는 커밋을 중앙 저장소로 푸시합니다.

방금 언급 한 내용에서 직접 파생 된 또 다른 예는 " Git과의 서버리스 연속 통합 "으로, 어디로 든 푸시하기 전에 작동 하는 로컬 비공개 빌드 를 적용하는 방법 입니다.


사람들의 로컬 리포지토리에 사전 커밋 후크를 강제 할 수는 없지만 중앙 리포지토리에서는 여전히 사전 수신 후크를 실행할 수 있습니다.

F. ex 커밋 메시지가 특정 규칙 (trac 통합 등)을 준수하는지 확인해야했기 때문에 중앙 저장소로 푸시되는 모든 커밋 메시지를 확인하고 그렇지 않은 경우 푸시를 거부하는 다음 사전 수신 후크를 사용했습니다. 환영합니다.

#! / bin / sh
rev_old rev_new ref를 읽는 동안
하다
    MALFORMED = "$ (git rev-list --oneline $ rev_old .. $ rev_new | egrep -v '# [0-9] +'| awk '{print $ 1}')"
    if [x "$ MALFORMED"! = x]
    그때
        $ MALFORMED의 잘못된 커밋 메시지를 echo
        1 번 출구
    fi
끝난

자세한 내용은 f.ex https://git-scm.com/book/en/v2/Customizing-Git-Git-Hooks를 참조 하십시오.


사전 커밋 후크를 해당 주 저장소에서 스크립팅하고 모든 복제본에 적용 할 수 있습니까?

에서 githooks(5):

    사전 커밋
      이 후크는 git commit에 의해 호출되며 다음으로 우회 할 수 있습니다.
      --no-verify 옵션.

후크는 쉽게 우회 할 수 있으므로 질문에 대한 대답은 "아니오"인 것 같습니다.

또한 .git / hooks 디렉토리가 복제되지 않았기 때문에 클라이언트에 푸시하는 메커니즘이없는 것 같습니다.


예, 아니오.

JavaScript를 작성 하는 경우 가장 좋은 방법은 Husky를 사용하는 것입니다. Husky에는 githook을 설정하고 관리하는 postInstall 스크립트가 있습니다. 그런 다음 package.json 또는 허스키 도트 파일에서 사전 커밋 및 사전 푸시 스크립트를 구성 할 수 있습니다.

이것을 사용하여 임의의 스크립트를 실행할 수 있습니다. 나는 일반적으로 yarn lintyarn testprepush.


JavaScript를 사용하지 않거나 Husky를 사용할 수없는 경우 커밋 후크를 개발자 컴퓨터에 복제하고 저장소에 체크인 할 수 있지만 개발자가 실행하도록 강제 할 수는 없습니다.

후크를 체크인하려면 hooks저장소 어딘가에 디렉토리를 만드 십시오. 그런 다음 일반적인 .git/hooks디렉토리 대신 후크를 넣으십시오 . 이것이 당신이 시행 할 수있는 부분입니다.

다른 부분은 개발자의 호의에 달려 있습니다. hooks 폴더를 hooksPath로 설정하려면 각 개발자가 다음을 실행해야합니다.

git config core.hooksPath hooks

이제 후크 폴더의 모든 후크가 예상대로 실행됩니다.


빌드 시스템과 관련된 빌드 시스템이있는 git 저장소에 소스 코드가 있다고 가정하면 빌드 시스템을 구성하여 사전 커밋 후크를 설정할 수 있습니다. 즉, 버전이 지정된 사전 커밋 후크를 이동하거나 연결합니다.

나는 이것을 아직 시도하지 않았다. 더 나은 솔루션을 찾기 위해 인터넷 검색을하는 동안 여기에 왔습니다.


새 파일을 만듭니다. pre-commit-hook.sh

#!/usr/bin/env bash
CHANGES=$(git whatchanged ..origin)

if [ ! -z "${CHANGES}" ]; then
    echo "There are changes in remote repository. Please pull from remote branch first."
    exit 1;
fi

exit 0;

그리고 이것이 내가 Git에 커밋하는 방법입니다.

bash pre-commit-hook.sh && git commit -m "<Commit message>"

참고 URL : https://stackoverflow.com/questions/3703159/git-remote-shared-pre-commit-hook

반응형