Escrevendo um hook git post-receive para lidar com um branch específico

Aqui está o meu gancho atual em um repository vazio que mora no servidor da empresa: git push origin master Este hooks empurra para Assembla. O que eu preciso é empurrar apenas uma ramificação (master, idealmente) quando alguém envia alterações para essa ramificação em nosso servidor e ignora os pushs para outras ramificações. É possível selecionar o ramo de um repository nu e empurrar apenas esse ramo para Assembla?

Um gancho post-receive obtém seus argumentos de stdin, no formato . Como esses argumentos são provenientes de stdin, não de um argumento de linha de comando, você precisa usar a read vez de $1 $2 $3 .

O gancho post-receive pode receber vários branches de uma só vez (por exemplo, se alguém fizer um git push --all ), então também precisamos envolver a read em um loop while.

Um trecho de trabalho é parecido com isto:

 #!/bin/bash while read oldrev newrev refname do branch=$(git rev-parse --symbolic --abbrev-ref $refname) if [ "master" == "$branch" ]; then # Do something fi done 

O último parâmetro que um hook pós-recebimento obtém em stdin é o que ref foi alterado, então podemos usá-lo para verificar se aquele valor foi “refs / heads / master”. Um pouco de ruby semelhante ao que eu uso em um gancho pós-recebimento:

 STDIN.each do |line| (old_rev, new_rev, ref_name) = line.split if ref_name =~ /master/ # do your push end end 

Note que ele recebe uma linha para cada referência que foi enviada, então, se você for mais do que apenas mestre, ele ainda funcionará.

A resposta de Stefan não funcionou para mim, mas isso aconteceu:

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

Nenhuma das soluções acima funcionou para mim. Depois de muita debugging, acontece que usar o comando ‘read’ não funciona – em vez disso, analisar os argumentos da linha de comando normalmente funciona bem.

Aqui está o gancho exato de pós-atualização que eu testei com sucesso agora no 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 

UPDATE: em uma nota ainda mais estranha, o hook pré-recebimento recebe sua input via stdin, portanto leia com ‘read’ (wow, nunca pensei que diria isso). O gancho pós-atualização ainda funciona com $ 1 para mim.

A resposta de @pauljz funciona bem para certos ganchos git como pre-push , mas pre-commit não tem access a essas variables oldrev newrev refname

Então eu criei esta versão alternativa que funciona para pre-commit, ou realmente e hook. Este é um gancho de pre-commit que irá executar um script husky se não estivermos no branch 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 

Espero que ajude alguém. Você pode modificar facilmente para suas necessidades, qualquer coisa entre as declarações if e fi .

Eu escrevi um script PHP para mim mesmo para fazer essa funcionalidade.

https://github.com/fotuzlab/githubdump-php

Hospede este arquivo no seu servidor, de preferência repo root e defina a url nos webhooks do github. Altere ‘allcommits’ na linha 8 com o nome da sua ramificação e adicione seu código / function na linha 18.

por exemplo

 function githubdump($payload_object) { // Write your code here. exec('git push origin master'); } 

Abordagem simples, em git hook write

 read refname echo $refname 

Simples – mais informações sobre este ótimo sistema de engate de links