웹 사이트 스테이징을위한 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
'Programing' 카테고리의 다른 글
MS C ++ 2010 및 mspdb100.dll (0) | 2020.12.08 |
---|---|
메인 스레드는 UI 스레드와 동일합니까? (0) | 2020.12.08 |
MyApp.vshost.exe를 죽일 수 없습니다. (0) | 2020.12.08 |
루비에서 가장 가까운 정수로 부동 소수점 반올림 (0) | 2020.12.08 |
Android : 루프에서 문자열 /과 함께 findViewById () 사용 (0) | 2020.12.08 |