113

これが、会社のサーバーにあるベアリポジトリの現在のフックです git push origin master 。このフックはAssemblaにプッシュします。私が必要としているのは、誰かがサーバー上のそのブランチに変更をプッシュしたときに1つのブランチ(マスター、理想的には)のみをプッシュし、他のブランチへのプッシュを無視することです。ベアリポジトリからブランチを選択し、そのブランチのみをAssemblaにプッシュすることは可能ですか?

4

7 に答える 7

400

post-receive フックは、stdin から次の形式で引数を取得します。

<oldrev> <newrev> <refname>

これらの引数は、コマンド ライン引数ではなく標準入力から取得されるため、read代わりにを使用する必要があります$1 $2 $3

post-receive フックは、一度に複数のブランチを受け取ることができるため (たとえば、誰かが を実行した場合)、 をループでgit push --allラップする必要もあります。readwhile

作業スニペットは次のようになります。

#!/bin/bash
while read oldrev newrev refname
do
    branch=$(git rev-parse --symbolic --abbrev-ref $refname)
    if [ "master" = "$branch" ]; then
        # Do something
    fi
done
于 2012-10-24T20:59:43.273 に答える
8

post-receive フックが stdin で取得する最後のパラメーターは、変更された ref であるため、それを使用して、その値が「refs/heads/master」であるかどうかを確認できます。post-receive フックで使用するものに似たルビーのビット:

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

プッシュされた ref ごとに行が取得されることに注意してください。そのため、master 以外をプッシュしても機能します。

于 2011-09-08T19:53:20.360 に答える
6

ステファンの答えは私にはうまくいきませんでしたが、これはうまくいきました:

#!/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"
于 2012-09-11T10:47:06.220 に答える
0

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

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

サーバーでこのファイルをホストし、できればレポ ルートをホストし、github Webhook で URL を定義します。8 行目の「allcommits」をブランチ名に変更し、18 行目にコード/関数を追加します。

例えば

function githubdump($payload_object) {
    // Write your code here.
    exec('git push origin master');
}
于 2013-12-01T13:13:14.057 に答える
0

簡単なアプローチ、git hook書き込み

read refname
echo $refname

シンプル - この優れたリンクフック システムの詳細

于 2015-12-03T10:30:36.990 に答える