Programing

웹 사이트 스테이징을위한 Git Post-Receive Hook

crosscheck 2020. 12. 8. 07:45
반응형

웹 사이트 스테이징을위한 Git Post-Receive Hook


git pull현재 버전을 로컬에서 작업 한 다음 git push변경 사항을 원격 서버로 푸시 할 수 있도록 웹 사이트를 준비하기 위해 Git을 설정하려고 합니다. 원하는 방식으로 작동하도록 설정했지만 푸시 한 후에는 수동으로 실행 git checkout -f하거나 git reset --hard HEAD원격 서버에서 실행해야 합니다.

나는 이것을 서버의 수신 후 후크로 쉘 스크립트에 넣으려고 시도했지만 효과가없는 것 같습니다. 푸시 한 후 "서버에 푸시 된 변경 사항"이 표시되기 때문에 스크립트가 실행되고 있음을 알고 있습니다. 수신 후 후크는 다음과 같습니다.

#!/bin/sh
git reset --hard HEAD
echo "Changes pushed to server."

귀하의 질문에 대한 답변은 여기에 있습니다 : http://toroid.org/ams/git-website-howto

간단히 말해, 베어 저장소에 "분리 된 작업 트리"를 추가하는 것입니다. 일반적으로 작업 트리가 .git디렉토리 를 포함한다고 생각합니다 . 베어 리포지토리에는 정의에 따라 작업 트리가 없지만 베어 리포지토리와 다른 디렉토리에있는 한 하나를 만들 수 있습니다.

수신 후 후크는 git checkout -f저장소 HEAD를 작업 디렉토리 에 복제 하는 간단한 방법 입니다. Apache는이를 문서 루트로 사용하고 모든 설정이 완료되었습니다. 베어 저장소로 푸시 할 때마다 Apache는 즉시 제공을 시작합니다.

나는 일반적으로 이것을 사용하여 자동으로 스테이징 서버에 푸시하여 "실제"환경이 내 변경 사항을 토할 것인지 확인합니다. 라이브 서버에 배포하는 것은 완전히 다른 이야기입니다. :-)


2015 년 3 월 업데이트

" 원격 저장소에 변경 사항을 푸시 할 때이 Git 경고 메시지는 무엇입니까? "에서 언급했듯이 실제로 다음 을 사용하여 비 베어 레포 (Git 2.3.0+, 2015 년 2 월)에 직접 푸시 할 수 있습니다 .

git config receive.denyCurrentBranch updateInstead

그에 따라 작업 트리를 업데이트하되 커밋되지 않은 변경 사항이있는 경우이를 거부하십시오.

그러면 수신 후 후크를 피할 수 있습니다.


(원래 답변 : 2010 년 10 월)

GitFAQ을 위한 권장 비 베어 REPO 이 업데이트 후 훅 :
(.이 후 업데이트 후크, 포스트받지를 당신에게 실제로 후크 실행에 무슨 일이 일어나고 있는지에 관해서는 더 많은 단서를 얻을이 참고 수 있음)

#!/bin/sh
#
# This hook does two things:
#
#  1. update the "info" files that allow the list of references to be
#     queries over dumb transports such as http
#
#  2. if this repository looks like it is a non-bare repository, and
#     the checked-out branch is pushed to, then update the working copy.
#     This makes "push" function somewhat similarly to darcs and bzr.
#
# To enable this hook, make this file executable by "chmod +x post-update".

git-update-server-info

is_bare=$(git-config --get --bool core.bare)

if [ -z "$is_bare" ]
then
    # for compatibility's sake, guess
    git_dir_full=$(cd $GIT_DIR; pwd)
    case $git_dir_full in */.git) is_bare=false;; *) is_bare=true;; esac
fi

update_wc() {
    ref=$1
    echo "Push to checked out branch $ref" >&2
    if [ ! -f $GIT_DIR/logs/HEAD ]
    then
        echo "E:push to non-bare repository requires a HEAD reflog" >&2
        exit 1
    fi
    if (cd $GIT_WORK_TREE; git-diff-files -q --exit-code >/dev/null)
    then
        wc_dirty=0
    else
        echo "W:unstaged changes found in working copy" >&2
        wc_dirty=1
        desc="working copy"
    fi
    if git diff-index --cached HEAD@{1} >/dev/null
    then
        index_dirty=0
    else
        echo "W:uncommitted, staged changes found" >&2
        index_dirty=1
        if [ -n "$desc" ]
        then
            desc="$desc and index"
        else
            desc="index"
        fi
    fi
    if [ "$wc_dirty" -ne 0 -o "$index_dirty" -ne 0 ]
    then
        new=$(git rev-parse HEAD)
        echo "W:stashing dirty $desc - see git-stash(1)" >&2
        ( trap 'echo trapped $$; git symbolic-ref HEAD "'"$ref"'"' 2 3 13 15 ERR EXIT
        git-update-ref --no-deref HEAD HEAD@{1}
        cd $GIT_WORK_TREE
        git stash save "dirty $desc before update to $new";
        git-symbolic-ref HEAD "$ref"
        )
    fi

    # eye candy - show the WC updates :)
    echo "Updating working copy" >&2
    (cd $GIT_WORK_TREE
    git-diff-index -R --name-status HEAD >&2
    git-reset --hard HEAD)
}

if [ "$is_bare" = "false" ]
then
    active_branch=`git-symbolic-ref HEAD`
    export GIT_DIR=$(cd $GIT_DIR; pwd)
    GIT_WORK_TREE=${GIT_WORK_TREE-..}
    for ref
    do
        if [ "$ref" = "$active_branch" ]
        then
            update_wc $ref
        fi
    done
fi

이 작업을 수행하려면 다음 구성 설정 중 하나를 사용하여 현재 분기에 대한 변경 사항을 푸시하도록 특별히 허용해야합니다.

git config receive.denyCurrentBranch ignore

또는

git config receive.denyCurrentBranch warn

나는 똑같은 문제가 있었다. 이 링크에 대한 회신 : http://toroid.org/ams/git-website-howto- 다음 명령이 수행했습니다.

sudo chmod +x hooks/post-receive

우리는 sudo처음에 물건을 구성한 권한을 놓쳤습니다 .


VonC 스크립트의 고정 버전은 저에게 적합합니다 (절대 보장 없음).

#!/bin/sh
#
# This hook does two things:
#
#  1. update the "info" files that allow the list of references to be
#     queries over dumb transports such as http
#
#  2. if this repository looks like it is a non-bare repository, and
#     the checked-out branch is pushed to, then update the working copy.
#     This makes "push" function somewhat similarly to darcs and bzr.
#
# To enable this hook, make this file executable by "chmod +x post-update".

set -e

git update-server-info

is_bare=$(git config --get --bool core.bare)

if [ -z "${is_bare}" ]
then
    # for compatibility's sake, guess
    git_dir_full=$(cd $GIT_DIR; pwd)
    case $git_dir_full in */.git) is_bare=false;; *) is_bare=true;; esac
fi

update_wc() {
    ref=$1
    echo "Push to checked out branch $ref" >&2
    if [ ! -f ${GIT_DIR}/logs/HEAD ]
    then
        echo "E:push to non-bare repository requires a HEAD reflog" >&2
        exit 1
    fi
    if (cd ${GIT_WORK_TREE}; git diff-files -q --exit-code >/dev/null)
    then
        wc_dirty=0
    else
        echo "W:unstaged changes found in working copy" >&2
        wc_dirty=1
        desc="working copy"
    fi
    if git diff-index --cached HEAD@{1} >/dev/null
    then
        index_dirty=0
    else
        echo "W:uncommitted, staged changes found" >&2
        index_dirty=1
        if [ -n "$desc" ]
        then
            desc="$desc and index"
        else
            desc="index"
        fi
    fi
    if [ "$wc_dirty" -ne 0 -o "$index_dirty" -ne 0 ]
    then
        new=$(git rev-parse HEAD)
        echo "W:stashing dirty $desc - see git-stash(1)" >&2
        ( trap 'echo trapped $$; git symbolic-ref HEAD "'"$ref"'"' 2 3 13 15 ERR EXIT
        git update-ref --no-deref HEAD HEAD@{1}
        cd ${GIT_WORK_TREE}
        git stash save "dirty $desc before update to $new";
        git symbolic-ref HEAD "$ref"
        )
    fi

    # eye candy - show the WC updates :)
    echo "Updating working copy" >&2
    (cd ${GIT_WORK_TREE}
    git diff-index -R --name-status HEAD >&2
    git reset --hard HEAD
    # need to touch some files or restart the application? do that here:
    # touch *.wsgi
    )

}

if [ x"${is_bare}" = x"false" ]
then
    active_branch=$(git symbolic-ref HEAD)
    export GIT_DIR=$(cd ${GIT_DIR}; pwd)
    GIT_WORK_TREE="${GIT_DIR}/.."
    for ref in $(cat)
    do
        if [ x"$ref" = x"${active_branch}" ]
        then
            update_wc $ref
        fi
    done
fi

이 git 배포를 설정하는 간단한 스크립트 :

수신 후 후크 준비 :

echo '#!/bin/sh'        >  .git/hooks/post-receive
echo 'git checkout -f'  >> .git/hooks/post-receive
echo 'git reset --hard' >> .git/hooks/post-receive
chmod +x .git/hooks/post-receive

이 저장소에 대한 푸시를 허용합니다.

git config receive.denycurrentbranch false

나는 추측하고 있지만 이것은 권한 문제 일 수 있습니다 (전체 경로가 필요합니까 cd??). 로그 파일에서 실제로 일어나는 일을 확인하십시오.

그러나 git을 통해 파일을 게시하는 것은 항상 게시 프로세스의 한 작업 일뿐입니다. 일반적으로 일부 파일을 복사하고, 다른 파일을 삭제하고, 설정하고, 권한을 업데이트하고, 문서를 생성해야합니다.

For a complex solution a build script might be better than any git hook. Tools which can handle those tasks very well:

(I realize this is not the answer you are expecting, but it's too long to post as a comment)

참고URL : https://stackoverflow.com/questions/3838727/git-post-receive-hook-for-website-staging

반응형