Gitのクライアント側で、リモートのmaster,developヘのpushを阻止する。

はじめに

普段は自社に居ないインフラ屋のY.Oでございます。

これまで、バージョン管理ツールはプログラマー屋さんの使うものという認識で、
Gitもソースコードを落として来るときにpullする程度でしたが、
昨今のインフラのコード化に伴い、最近ではGitをかなりの頻度で使用しております。

Gitを使っていく中で、いくつか「やってはいけない」お作法を現場で出会った方々に
教えて頂きました。

開発プロセスにもよるかもしれませんが、そのなかの一つが、
リモートの"master" や "develop" ブランチヘのpushはやってはいけないということ。

"Pull Request" や "Merge Request" を使った開発プロセスの場合、
コードのレビューが済んでからリモートの"master" や "develop"へ
取り込むといった流れになりますので、直接リモートの"master" や "develop"ヘ
push するのはご法度とされていることが多いかと思います。

やってはいけないのなら、リモート側でブランチを保護しておきたいところですが、
借用するリモートリポジトリが勝手に触れない場合もございますので、
ローカル側で"master","develop"ブランチへのpushを検知して止めるようにしてみたいと
思います。

何を使って実現するか

Gitには特定のアクションが発生したときに、スクリプトを実行する仕組みとして
Gitフックが用意されています。そのGitフックの中でも、push時に動作してくれる
"pre-pushフック"を今回は使用します。

Gitフックの詳細については、こちらこちらをご覧ください。

pre-pushフックを設定する

Git管理下のディレクトリに、.git/hooks/pre-pushというスクリプトを配置して、
実行権限を付けると設定終了です。

.git/hooks/内には、pre-push.sampleというファイルが既に格納されていましたので、
これを参考に、下記のようなスクリプトを作成しました。

#!/bin/sh
not_allowed_branchies="master develop"
read local_ref local_sha remote_ref remote_sha
remote_branch=echo ${remote_ref} | awk -F "/" '{ print $NF }'
for branch in echo ${not_allowed_branchies}
do
if [[ "${remote_branch}" = "${branch}" ]]; then
echo "***************************************************************"
echo "リモートの${branch}ブランチへpushしようとしたので中断しました!"
echo "***************************************************************"
exit 1
fi
done

pre-pushフックが発生すると標準出力を介して、更新する参照のリストなるものが
取得できますので、readコマンドで取得し、その中にpushしてはいけないブランチ名が
見つかればexit 1 で終了させるといった挙動をします。

以上

返信を残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA