2011-09-08 15 views
87

Şirket sunucusunda yaşayan şu andaki çengelimde şu anki kanca var: git push origin master Bu kancalar Assembla'ya iter. İhtiyacım olan şey, birisi sunucumuzdaki bu şubeye değişiklikleri iterken ve diğer şubelere yapılan itirazları görmezden geldiğinde yalnızca bir dalı (ana, ideal olarak) zorlamaktır. Şubeyi çıplak bir repodan seçmek mümkün mü ve sadece bu dalı Assembla'ya itmek mümkün mü?Belirli bir şube ile başa çıkmak için git sonrası alma kancası yazılıyor

+0

Ne demek istiyorsun? Git itme kökeni ana, sadece 'master' dalını Assembla olarak tanımladığımı farzedilen 'origin' uzaktan kumandasına itecektir. Sadece birisinin '' özellik1''in tersine '' usta '' ya iterken, ya da böyle bir şey olduğunda * tetiklemeniz gerektiğini mi söylüyorsunuz? –

+0

@Stefan Tam olarak bu. Kelimeyi bulamadım hehe. –

+0

Yinelenen http://stackoverflow.com/questions/6372334/git-commit-hooks-per-branch – insign

cevap

7

Sonradan alma kancasının stdin almasıyla ilgili son parametre, ref değerinin değiştirilmesidir, bu yüzden bu değerin "refs/heads/master" olup olmadığını kontrol etmek için kullanabiliriz. Bir kullanmak ne benzer yakut Biraz kanca sonrası alırsınız: o itildi her ref bir çizgi aldığını

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

Not, bu nedenle sadece ana daha itilirse, hala çalışacaktır.

+0

Ruby örneği için teşekkürler. Buna benzer bir şey yapacağım. – Leif

5
Stefan'ın cevabı benim için işe yaramadı

ancak this yaptı:

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

Basit bir isimle (master, test, vb.) Şubeler için çalıştım. Ama ben böyle bir şube adı var: prod12/proj250/ropesPatch12. iyi işe yaramıyor. Bu özel karakterlerle çalışabilecek bir çözümünüz var mı? –

335

bir kanca biçiminde <oldrev> <newrev> <refname> yılında, stdin'den Bağımsız değişkenlerini alır sonrası alırlar. Bu argümanlar bir komut satırı argümanından değil, stdin'den geldiğinden, $1 $2 $3 yerine read kullanmanız gerekir.

sonrası almak (birisi git push --all yaparsa örneğin) bir kerede birden fazla şubesi alabilir kanca, bu yüzden de bir while döngü içinde read sarmak gerekiyor. Yukarıda benim için çalıştı çözümlerin

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

Bu, doğru cevap olarak işaretlenmelidir. – jackyalcine

+2

"==" benim için çalışmıyor. Tek ile "=" benim için iyi çalışıyor. – Ray

+0

Bu garip. Çift eşittir ve tek eşittir burada hem iyi çalışmalıdır (bkz. Http://stackoverflow.com/questions/2600281/what-is-the-difference-between-operator-and-in-bash). Bash'tan başka bir şey kullanıyor musun? Ne olursa olsun, bunun için bir düzeltme bulduğunuz için sevindim. – pauljz

3

Ne:

Bir çalışma pasajı şuna benzer. Çok fazla hata ayıklama işleminden sonra, 'read' komutunu kullanmanın işe yaramayacağı ortaya çıkıyor - bunun yerine, komut satırı argümanlarını ayrıştırma işlemi normal şekilde çalışıyor.

Şu anda CentOS 6.3'te şimdi başarıyla test ettiğim tam güncelleştirme sonrası kanca.

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

GÜNCELLEME: Bir daha da garip bir not, kanca nedenle (vay, demek hiç düşünmezdim) 'okundu' ile okumak, Stdin aracılığıyla kendi girdi alır öncesi alırlar. Güncelleme sonrası kanca hala benim için 1 $ ile çalışır.

+2

Değeri için, yukarıdaki çözümler işe yaramış olabilir çünkü özellikle "post-al" kancaları için değil, post-update-hook'lar için. Girişlerini farklı şekillerde alıyorlar. – pauljz

+0

'post-aldatma' stdin'i şu şekilde not aldı: https://git-scm.com/book/en/v2/Customizing-Git-Git-Hooks – h4xnoodle

0

Bu işlevi yapmak için kendim için bir PHP betiği yazmıştım.

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

Sunucu sunucu üzerinde bu dosya, tercihen repo kökü ve github webhooks içinde URL tanımlamalıdır. Satır ile satır 8 'allcommits' değiştirin ve kod/işlev 18. satırda ekleyin.

ör.

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

Basit yaklaşım, git hook yazma içinde

read refname 
echo $refname 

Basit - daha bu büyük linke hooking system

0

pre-push gibi belirli git kanca için çalışıyor @pauljz gelen cevap üzerine bilgi, ancak pre-commit yapar oldrev newrev refname

Bu değişkenlere erişemediğim için Ön-taahhüt ya da gerçekten ve kanca için çalışır. Bu, master dalında DEĞİLSE husky komut dosyasını çalıştıracak olan pre-commit kancasını.

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

Umarım birilerine yardımcı olur. if ve fi ifadeleri arasında ihtiyaçlarınızı kolayca değiştirebilirsiniz.

İlgili konular