2011-09-08 6 views
87

会社のサーバーにある裸のレポの私の現在のフックは以下の通りです: git push origin master これはAssemblaにプッシュします。 私が必要とするのは、誰かが私たちのサーバー上のそのブランチに変更をプッシュし、他のブランチへのプッシュを無視するときに、1つのブランチ(マスター、理想的には)だけをプッシュすることです。裸のレポからブランチを選択し、そのブランチだけをAssemblaにプッシュすることは可能ですか?特定のブランチを扱うためにgit post-receiveフックを書く

+0

どういう意味ですか? 'git push origin master'は' master'ブランチを 'origin'リモートにプッシュするだけです。私はAssemblaと定義されていると仮定します。誰かが 'feature1'などとは対照的に、' master'にプッシュするときにのみ、フックをトリガーする必要があると言っていますか? –

+0

@Stefanまさにそれ。私は言葉heheを見つけることができませんでした。 –

+0

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

答えて

7

ポスト受信フックが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 

注それが押された各参照の行を取得しますので、あなただけの習得以上のものを押した場合、それはまだ動作すること:私はポスト受信フックで使用しているものに似たルビーのビット。

+0

Rubyの例をありがとう。私はこれに似た何かをするつもりです。 – Leif

5

ステファンの答えは私のために動作しませんでしたが、thisはなかった:

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

シンプルな名前(マスター、テストなど)のブランチのために私のために働いたが、私はそのようなブランチ名を持っていた:prod12/proj250/ropesPatch12。それはうまくいきません。それらの特殊文字を扱うことができるソリューションはありますか? –

335

ポスト受けるフックはフォーム<oldrev> <newrev> <refname>で、標準入力から引数を取得します。これらの引数はコマンドライン引数ではなく、標準入力から来るので、$1 $2 $3の代わりにreadを使用する必要があります。

ポスト受信フックは複数のブランチを一度に受け取ることができます(たとえば、誰かがgit push --allを行った場合など)、を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 
+48

これは正解とマークする必要があります。 – jackyalcine

+2

「==」は私のためには機能しません。シングル "="は私のためにうまく機能します。 – Ray

+0

これは奇妙です。 Double EqualsとSingle Equalsは両方とも正常に動作するはずです(http://stackoverflow.com/questions/2600281/what-is-the-difference-between-operator-and-in-bashを参照)。おそらく、bash以外のものを使用していますか?それにもかかわらず、あなたはそれのための修正を見つけてうれしい。 – pauljz

3

どちらも私のために働いた上記の解決策の:

作業スニペットは、次のようになります。多くのデバッグの後で、 'read'コマンドを使用しても動作しないことが判明しました。代わりに、コマンドライン引数を解析するのが普通の方法でうまくいきます。

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:でも、見知らぬ人のノートに、フックはそれゆえ(うわー、私がいることを言うだろうと思ったことはありません)「読み取り」と読み、標準入力経由でその入力を取る前受けます。更新後のフックはまだ$ 1で動作します。

+2

上記の解決策は、特にpost-updateフックではなく、post-updateフックであるため、効果がないかもしれません。彼らはさまざまな方法で入力を受けます。 – pauljz

+0

'post-receive'はここに記載されているように標準入力をとります:https://git-scm.com/book/en/v2/Customizing-Git-Git-Hooks – h4xnoodle

0

私は自分自身でこの機能を実行するためのPHPスクリプトを作成しました。

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

ホストサーバー上でこのファイルを、好ましくはレポルートとgithubののウェブフックにURLを定義します。 8行目の「allcommits」をブランチ名に変更し、18行目にコード/機能を追加してください。

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

git hook書き込み

read refname 
echo $refname 

シンプルで簡単なアプローチ、 - @pauljzから、この偉大なリンク詳細hooking system

0

答えはpre-pushのような特定のGitのフックのため正常に動作しますが、pre-commitんこれらの変数にアクセスできないoldrev newrev refname

この代替バージョンを作成しました事前コミット、または本当にフックのために働く。 masterブランチに属していない場合、これはフックでhuskyスクリプトを実行します。

#!/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ステートメントの間の何かをあなたのニーズに合わせて簡単に変更することができます。

関連する問題