developer tip

자식 푸시 후 로컬 실행 후크?

optionbox 2020. 11. 27. 08:01
반응형

자식 푸시 후 로컬 실행 후크?


githooks 맨 페이지를 살펴 보았지만 뭔가 누락되지 않는 한 로컬 포스트 푸시 git 후크에 대한 옵션이 표시되지 않습니다. 마스터 브랜치를 GitHub 리포지토리로 푸시 한 후 웹 서버 (이미 스크립트가있는)에서 API 문서를 업데이트하는 파일을 갖고 싶습니다. 물론 git push와 api 문서 실행을 결합하는 스크립트를 직접 작성할 수 있지만 다소 우아하지 않은 느낌이 듭니다.


Git 1.8.2부터 푸시 작업 전에 호출되는 새로운 후크가 있습니다. pre-push 스크립트가 0이 아닌 다른 값을 반환하면 푸시 작업이 취소됩니다.

릴리스 정보에 언급 : https://github.com/git/git/blob/master/Documentation/RelNotes/1.8.2.txt#L167

샘플 : https://github.com/git/git/blob/87c86dd14abe8db7d00b0df5661ef8cf147a72a3/templates/hooks--pre-push.sample


이 문제에 대한 또 다른 해결책 호출 전후에 git push실행 .git/hooks/pre-push.git/hooks/post-push스크립트에 대한 래퍼를 갖는 것 git push입니다. 가능한 래퍼는 다음과 같습니다.

#!/bin/sh

GIT_DIR_="$(git rev-parse --git-dir)"
BRANCH="$(git rev-parse --symbolic --abbrev-ref $(git symbolic-ref HEAD))"

PRE_PUSH="$GIT_DIR_/hooks/pre-push"
POST_PUSH="$GIT_DIR_/hooks/post-push"

test -x "$PRE_PUSH" &&
    exec "$PRE_PUSH" "$BRANCH" "$@"

git push "$@"

test $? -eq 0 && test -x "$POST_PUSH" &&
    exec "$POST_PUSH" "$BRANCH" "$@"

에서 git-push-wh어딘가에 저장 PATH한 다음 git push-wh후크를 사용하여 푸시하려는 것처럼 호출 할 수 있습니다 .


이 유형의 후크는 Git에서 지원되지 않습니다. Git의 유지 관리자가 제공 한 Git 후크유효한 이유를 벗어납니다 .

위 링크 된 메시지의 소개 내용은 귀하의 경우에 거의 직접적으로 나타납니다.

저는 작업이 로컬에서 시작되고 로컬 데이터에서만 작동하는 후크를 특히 좋아하지 않습니다. 다른 사람들보다 더 높은 수준의 스크립팅에 적합한 git 도구 빌딩 블록을 여전히 고려하기 때문일 수 있습니다.

PS A "싱글 푸시"힌트

  • 전체 설명에 대한주의 사항이 너무 많지만 모든 것을 이해할 수 있다면 세부 사항을 다룰 수 있어야합니다.

pushurl"대체"객체 저장소가있는 로컬 리포지토리에 추가 하면 로컬에서 푸시 후크를 실행하는 오버 헤드를 줄일 수 있습니다. 그러나 실제로 노력은 그 이상입니다 git push upstream && update-web-server(쉘 별칭, git 별칭 또는 스크립트 일 수 있음).


나는 최근에 같은 문제를 만났습니다. 내 자식 하위 모듈의 푸시가 '수퍼 프로젝트'의 새 하위 모듈 참조를 커밋 할 수 있도록 후크를 원했습니다.

Chris가 언급했듯이 가장 좋은 방법은 다음과 같이 git 별칭을 사용하는 것입니다.

$ git config alias.xpush '!git push $1 $2 && update-server.sh'
# (remember the backslash before the ! if your shell requires it)

그러면 .git / config 파일에 다음이 추가됩니다.

[alias]
  xpush = !git push $1 $2 && update-server.sh

이제 다음을 입력하면 :

$ git xpush

변경 사항이 푸시되고 update-server.sh가 실행됩니다.


이 기능을 사용하고 있습니다.

current_branch() {
    local ref=$(git symbolic-ref HEAD 2> /dev/null) || return
    echo ${ref#refs/heads/}
}

gp() {
    local post_push="$(git rev-parse --git-dir)/hooks/post-push"
    git push "$@" && {
        [[ -x "$post_push" ]] && "$post_push" "$(current_branch)" "$@"
    }
}
compdef _git gp=git-push

compdef 부분은 ZSH 용입니다.

참고 URL : https://stackoverflow.com/questions/1797074/local-executing-hook-after-a-git-push

반응형