24時間365日フルマネージドホスティングサービスのデイーネット

  • HOME
  •  
  • 技術情報ブログ
  •  
  • Gitのクライアント側で、リモートのmaster,developヘのpushを阻止する。

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 で終了させるといった挙動をします。

以上

  • このページの先頭へ

  • 東京本社
    〒105-0001東京都港区虎ノ門2-3-22 第一秋山ビル5F
    TEL:03-3591-8887 FAX:03-3591-8886
  • 大阪本社
    〒541-0041 大阪市中央区北浜2-6-11北浜エクセルビル5F
    TEL:06-6231-8887 FAX:06-6231-8897

  • 認証範囲はこちらをご覧ください。

Denet logo

クラウドサービス・データセンタ・高機能専有サーバ・共有サーバホスティングサービス 株式会社ディーネット
dot_bar