다음은 회사 서버에있는 베어 저장소의 현재 후크입니다.
git push origin master
이 후크는 Assembla로 푸시됩니다. 내가 필요한 것은 누군가가 우리 서버의 해당 분기에 변경 사항을 푸시 할 때 하나의 분기 (이상적으로는 마스터) 만 푸시하고 다른 분기에 대한 푸시는 무시하는 것입니다. 베어 저장소에서 분기를 선택하고 해당 분기 만 Assembla로 푸시 할 수 있습니까?
답변
수신 후 후크는 형식으로 stdin에서 인수를 가져옵니다 <oldrev> <newrev> <refname>
. 이러한 인수가없는 명령 행 인수에서 표준 입력에서 오는 때문에, 당신은 사용할 필요가 read
대신 $1 $2 $3
.
포스트받을 후크가 한 번에 여러 가지를받을 수 있습니다 (누군가를 않는 경우, 예를 들어 git push --all
), 우리는 또한 포장 할 필요가 있으므로 read
A의 while
루프.
작동하는 스 니펫은 다음과 같습니다.
#!/bin/bash
while read oldrev newrev refname
do
branch=$(git rev-parse --symbolic --abbrev-ref $refname)
if [ "master" = "$branch" ]; then
# Do something
fi
done
답변
수신 후 후크가 stdin에서 가져 오는 마지막 매개 변수는 ref가 변경된 것이므로 해당 값이 “refs / heads / master”인지 확인하는 데 사용할 수 있습니다. 수신 후 후크에서 사용하는 것과 비슷한 약간의 루비 :
STDIN.each do |line|
(old_rev, new_rev, ref_name) = line.split
if ref_name =~ /master/
# do your push
end
end
푸시 된 각 참조에 대한 라인을 가져 오므로 마스터 이상을 푸시해도 여전히 작동합니다.
답변
Stefan의 대답은 나에게 효과가 없었지만 이것은 효과 가 있습니다.
#!/bin/bash
echo "determining branch"
if ! [ -t 0 ]; then
read -a ref
fi
IFS='/' read -ra REF <<< "${ref[2]}"
branch="${REF[2]}"
if [ "master" == "$branch" ]; then
echo 'master was pushed'
fi
if [ "staging" == "$branch" ]; then
echo 'staging was pushed'
fi
echo "done"
답변
위의 솔루션 중 어느 것도 저에게 효과적이지 않았습니다. 많은 디버깅 끝에 ‘읽기’명령을 사용하는 것이 작동하지 않는 것으로 나타났습니다. 대신 명령 줄 인수를 일반적인 방식으로 구문 분석하면 정상적으로 작동합니다.
다음은 CentOS 6.3에서 방금 성공적으로 테스트 한 정확한 업데이트 후 후크입니다.
#!/bin/bash
echo "determining branch"
branch=`echo $1 | cut -d/ -f3`
if [ "master" == "$branch" ]; then
echo "master branch selected"
fi
if [ "staging" == "$branch" ]; then
echo "staging branch selected"
fi
exec git update-server-info
업데이트 : 더 낯선 메모에서 pre-receive 후크는 stdin을 통해 입력을 받으므로 ‘read’로 읽습니다 (와우, 내가 그렇게 말할 줄은 몰랐습니다). 업데이트 후 후크는 여전히 $ 1에서 작동합니다.
답변
@pauljz의 답변은와 같은 특정 git 후크에 대해 잘 작동 pre-push
하지만 pre-commit
해당 변수에 대한 액세스 권한이 없습니다.oldrev newrev refname
그래서 저는 pre-commit 또는 실제로 작동하는 대체 버전을 만들었습니다. 이것은 우리가 브랜치 에 있지 않은 경우 스크립트 pre-commit
를 실행 하는 후크입니다 .husky
master
#!/bin/bash
# git 'commit' does not have access to these variables: oldrev newrev refname
# So get the branch name off the head
branchPath=$(git symbolic-ref -q HEAD) # Something like refs/heads/myBranchName
branch=${branchPath##*/} # Get text behind the last / of the branch path
echo "Head: $branchPath";
echo "Current Branch: $branch";
if [ "master" != "$branch" ]; then
# If we're NOT on the Master branch, then Do something
# Original Pre-push script from husky 0.14.3
command_exists () {
command -v "$1" >/dev/null 2>&1
}
has_hook_script () {
[ -f package.json ] && cat package.json | grep -q "\"$1\"[[:space:]]*:"
}
cd "frontend" # change to your project directory, if .git is a level higher
# Check if precommit script is defined, skip if not
has_hook_script precommit || exit 0
# Node standard installation
export PATH="$PATH:/c/Program Files/nodejs"
# Check that npm exists
command_exists npm || {
echo >&2 "husky > can't find npm in PATH, skipping precommit script in package.json"
exit 0
}
# Export Git hook params
export GIT_PARAMS="$*"
# Run npm script
echo "husky > npm run -s precommit (node `node -v`)"
echo
npm run -s precommit || {
echo
echo "husky > pre-commit hook failed (add --no-verify to bypass)"
exit 1
}
fi
누군가에게 도움이되기를 바랍니다. 필요에 따라 if
및 fi
문 사이의 모든 것을 쉽게 수정할 수 있습니다 .
답변
이 기능을 수행하기 위해 PHP 스크립트를 작성했습니다.
https://github.com/fotuzlab/githubdump-php
서버에서이 파일을 호스팅하고, 가급적 repo 루트를 호스트하고 github 웹훅에서 URL을 정의하십시오. 분기 이름으로 8 행의 ‘allcommits’를 변경하고 18 행에 코드 / 함수를 추가하십시오.
예 :
function githubdump($payload_object) {
// Write your code here.
exec('git push origin master');
}