会社のサーバーにある裸のレポの私の現在のフックは以下の通りです: git push origin master
これはAssemblaにプッシュします。 私が必要とするのは、誰かが私たちのサーバー上のそのブランチに変更をプッシュし、他のブランチへのプッシュを無視するときに、1つのブランチ(マスター、理想的には)だけをプッシュすることです。裸のレポからブランチを選択し、そのブランチだけをAssemblaにプッシュすることは可能ですか?特定のブランチを扱うためにgit post-receiveフックを書く
答えて
ポスト受信フックが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
注それが押された各参照の行を取得しますので、あなただけの習得以上のものを押した場合、それはまだ動作すること:私はポスト受信フックで使用しているものに似たルビーのビット。
Rubyの例をありがとう。私はこれに似た何かをするつもりです。 – Leif
ステファンの答えは私のために動作しませんでしたが、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"
シンプルな名前(マスター、テストなど)のブランチのために私のために働いたが、私はそのようなブランチ名を持っていた:prod12/proj250/ropesPatch12。それはうまくいきません。それらの特殊文字を扱うことができるソリューションはありますか? –
ポスト受けるフックはフォーム<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
これは正解とマークする必要があります。 – jackyalcine
「==」は私のためには機能しません。シングル "="は私のためにうまく機能します。 – Ray
これは奇妙です。 Double EqualsとSingle Equalsは両方とも正常に動作するはずです(http://stackoverflow.com/questions/2600281/what-is-the-difference-between-operator-and-in-bashを参照)。おそらく、bash以外のものを使用していますか?それにもかかわらず、あなたはそれのための修正を見つけてうれしい。 – pauljz
どちらも私のために働いた上記の解決策の:
作業スニペットは、次のようになります。多くのデバッグの後で、 '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で動作します。
私は自分自身でこの機能を実行するための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');
}
答えは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
誰かを助けることを願っています。あなたは、if
とfi
ステートメントの間の何かをあなたのニーズに合わせて簡単に変更することができます。
- 1. 特定のブランチから新しいブランチを作成しないようにするためのGitフック
- 2. 多くのブランチを扱うGIT
- 3. Gitの特定のブランチにフックを適用
- 4. git - リモートの特定のブランチに特定のブランチをプッシュ
- 5. gitフックで特定のブランチの著者名を自動的に変更
- 6. PHPを使ってgitフックを書く
- 7. 特定のGitブランチをインストールする
- 8. ブランチGitの特定の変更点
- 9. Jenkins。特定のgitブランチのタスクを設定するには?
- 10. gitサーバーサイドフック - 特定のブランチのみがプッシュされます
- 11. Git:特定のコミットを別のブランチに移動する。
- 12. Gitはリモートの特定のブランチにローカルマスターをプッシュ
- 13. 特定のブランチをgitとマージするには?
- 14. 設定ファイルを扱うためのデザイン
- 15. Gitミラーを特定のブランチにミラー化する
- 16. Git:あるブランチのコードを別のブランチに上書きする
- 17. Git - ファイル名の混在を扱う
- 18. 特定のgitブランチをamazon ec2インスタンスのサブセットに展開するためのビルドスクリプトをトリガーするツールを探る
- 19. 症状ペアを特定するためのアルゴリズムを書く
- 20. 特定のブランチのまとめ
- 21. すべてのgitサブモジュールで1つの特定のブランチをチェックアウト
- 22. Git:リモートリポジトリへのプッシュはうまく動作します。今、新しいブランチを扱うには?
- 23. コミットメッセージにJIRAチケット番号を強制するためのgitフック
- 24. git内の特定のファイルを含むブランチ
- 25. 特定のgitリビジョンをチェックアウトするためにブランチを作成する必要がありますか?
- 26. gitブランチへの固定
- 27. 投稿を開くためのWordPressフック
- 28. Gitは特定のブランチをreflogしますか?
- 29. 特定のコミットからgitブランチを追跡する
- 30. Git:現在のレファレンスにブランチを設定
どういう意味ですか? 'git push origin master'は' master'ブランチを 'origin'リモートにプッシュするだけです。私はAssemblaと定義されていると仮定します。誰かが 'feature1'などとは対照的に、' master'にプッシュするときにのみ、フックをトリガーする必要があると言っていますか? –
@Stefanまさにそれ。私は言葉heheを見つけることができませんでした。 –
重複http://stackoverflow.com/questions/6372334/git-commit-hooks-per-branch – insign