깃 사전 푸시 후크
모든 git push 전에 유닛 테스트를 실행하고 테스트가 실패하면 push를 취소하고 싶지만 pre-push hook도 찾을 수 없고 pre-commit과 pre-rebase만 있습니다.
잘 알겠습니다.pre-push
을 낚아채다1.8.2
풀어주다.
샘플pre-push
스크립트: https://github.com/git/git/blob/87c86dd14abe8db7d00b0df5661ef8cf147a72a3/templates/hooks--pre-push.sample
1.8.2 릴리스 노트에서 새로운 사전 부트 후크에 대해 설명: https://github.com/git/git/blob/master/Documentation/RelNotes/1.8.2.txt
Git은 1.8.2 릴리즈에서 푸시 후크를 사전에 설치했습니다.
사전 푸시 후크는 사전 커밋 후크와 함께 필요했습니다.분기를 보호하는 것 외에도 사전 커밋 후크와 결합된 추가 보안을 제공할 수 있습니다.
사용 방법에 대한 예를 들어 보겠습니다(이 멋진 엔트리에서 채택 및 개선).
부랑자에 로그인하고 테스트를 실행한 다음 푸시하는 간단한 예
#!/bin/bash
# Run the following command in the root of your project to install this pre-push hook:
# cp git-hooks/pre-push .git/hooks/pre-push; chmod 700 .git/hooks/pre-push
CMD="ssh vagrant@192.168.33.10 -i ~/.vagrant.d/insecure_private_key 'cd /vagrant/tests; /vagrant/vendor/bin/phpunit'"
protected_branch='master'
# Check if we actually have commits to push
commits=`git log @{u}..`
if [ -z "$commits" ]; then
exit 0
fi
current_branch=$(git symbolic-ref HEAD | sed -e 's,.*/\(.*\),\1,')
if [[ $current_branch = $protected_branch ]]; then
eval $CMD
RESULT=$?
if [ $RESULT -ne 0 ]; then
echo "failed $CMD"
exit 1
fi
fi
exit 0
예제에서 볼 수 있듯이, 사전 푸시 후크의 제목인 보호된 분기를 사용합니다.
명령줄을 사용하는 경우 가장 쉬운 방법은 장치 테스트를 실행하고 성공한 경우 푸시를 완료하는 푸시 스크립트를 작성하는 것입니다.
편집
git 1.8.2부터 이 답변은 구식입니다.위의 manojlds의 답변을 참조하십시오.
푸시는 저장소를 수정하는 작업이 아니기 때문에 후크가 없습니다.
하지만 당신은 받는 쪽에서 검사를 할 수 있습니다.post-receive
훅. 보통 들어오는 푸시를 거부하는 곳입니다.유닛 테스트를 실행하는 것은 약간의 집중력이 필요할 수 있지만, 그것은 여러분에게 달려있습니다.
참고로, Git 1.6에 사전 푸시 후크를 추가하는 패치가 있습니다.1.7과 반대로 작동하는지 모르겠습니다.
그것을 엉망으로 만들기보다는 @kubi가 권장하는 푸시 스크립트를 실행할 수 있습니다.대신 Rake 작업을 수행하여 보고서에 저장할 수도 있습니다.루비 깃이 도움이 될 수 있습니다.대상 repo를 선택하면 프로덕션 repo로 푸시할 때만 테스트를 실행할 수 있습니다.
마지막으로, 당신은 당신의 테스트를 실행할 수 있습니다.pre-commit
후크하지만 분기가 커밋되는 대상을 확인합니다.그러면 당신은, 예를 들면,production
커밋을 수락하기 전에 모든 테스트를 통과해야 하지만 사용자의master
상관하지 않습니다.리머릭_dll은 그 시나리오에서 유용할 수 있습니다.
투표율이 높은 답변에 의해 연결된 스크립트는 후크에 대한 매개변수 등을 보여줍니다.$1
이름인 원격이다니름입니다.$2
URL) 및커 스라하는법방액세에(줄 URL)read
stdin have 구조 stdin have 구로부터조.<local ref> <local sha1> <remote ref> <remote sha1>
)
#!/bin/sh
# An example hook script to verify what is about to be pushed. Called by "git
# push" after it has checked the remote status, but before anything has been
# pushed. If this script exits with a non-zero status nothing will be pushed.
#
# This hook is called with the following parameters:
#
# $1 -- Name of the remote to which the push is being done
# $2 -- URL to which the push is being done
#
# If pushing without using a named remote those arguments will be equal.
#
# Information about the commits which are being pushed is supplied as lines to
# the standard input in the form:
#
# <local ref> <local sha1> <remote ref> <remote sha1>
#
# This sample shows how to prevent push of commits where the log message starts
# with "WIP" (work in progress).
remote="$1"
url="$2"
z40=0000000000000000000000000000000000000000
while read local_ref local_sha remote_ref remote_sha
do
if [ "$local_sha" = $z40 ]
then
# Handle delete
:
else
if [ "$remote_sha" = $z40 ]
then
# New branch, examine all commits
range="$local_sha"
else
# Update to existing branch, examine new commits
range="$remote_sha..$local_sha"
fi
# Check for WIP commit
commit=`git rev-list -n 1 --grep '^WIP' "$range"`
if [ -n "$commit" ]
then
echo >&2 "Found WIP commit in $local_ref, not pushing"
exit 1
fi
fi
done
exit 0
차라리 사전 커밋 후크로 테스트를 실행하겠습니다.커밋할 때 변경 사항이 이미 기록되어 있기 때문입니다.이미 기록된 변경 사항에 대한 정보만 주고받습니다.테스트가 실패하면 리포지토리에 이미 "손상된" 수정본이 있습니다.네가 밀어붙이든 말든.
언급URL : https://stackoverflow.com/questions/4196148/git-pre-push-hooks
'programing' 카테고리의 다른 글
텍스트 영역의 테두리 색을 변경하는 방법:focus (0) | 2023.08.19 |
---|---|
이 오류 " $. to JSON은 함수가 아닙니다. " (0) | 2023.08.19 |
iOS 5.0 사용자 에이전트 문자열은 무엇입니까? (0) | 2023.08.19 |
Xampp MySQL이 시작되지 않음 - "MySQL 서비스를 시작하는 중...." (0) | 2023.08.19 |
알파 테스터는 어디에서 구글 플레이 안드로이드 앱을 다운로드합니까? (0) | 2023.08.19 |