특정 분기를 처리하기 위해 git post-receive 후크 작성 베어 저장소의 현재 후크입니다. git

다음은 회사 서버에있는 베어 저장소의 현재 후크입니다.
git push origin master
이 후크는 Assembla로 푸시됩니다. 내가 필요한 것은 누군가가 우리 서버의 해당 분기에 변경 사항을 푸시 할 때 하나의 분기 (이상적으로는 마스터) 만 푸시하고 다른 분기에 대한 푸시는 무시하는 것입니다. 베어 저장소에서 분기를 선택하고 해당 분기 만 Assembla로 푸시 할 수 있습니까?



답변

수신 후 후크는 형식으로 stdin에서 인수를 가져옵니다 <oldrev> <newrev> <refname>. 이러한 인수가없는 명령 행 인수에서 표준 입력에서 오는 때문에, 당신은 사용할 필요가 read대신 $1 $2 $3.

포스트받을 후크가 한 번에 여러 가지를받을 수 있습니다 (누군가를 않는 경우, 예를 들어 git push --all), 우리는 또한 포장 할 필요가 있으므로 readA의 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를 실행 하는 후크입니다 .huskymaster

#!/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

누군가에게 도움이되기를 바랍니다. 필요에 따라 iffi문 사이의 모든 것을 쉽게 수정할 수 있습니다 .


답변

이 기능을 수행하기 위해 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');
}


답변

간단한 접근 방식, git hook쓰기

read refname
echo $refname

단순함-이 훌륭한 링크 후킹 시스템 에 대한 자세한 정보