gitの現在のブランチをチェックするシェルスクリプト

カテゴリー
Git

概要

目標のリポジトリのパスで git コマンドを叩いて、
そこからブランチ名をチェックする bash スクリプトのサンプルです。

目的

ソースコードを自動的にデプロイしたりコミットするときの事故防止のブランチ名チェックや
諸事情で GitHub main master をロックできないけど自衛したい場合などに。

サンプルコード1は単純にチェックする部分のみ、
サンプルコード2はローカルでのgitコマンドの実行時に割り込んでセーフティとして使う場合の扱い方です。

使い方

スクリプト中の REPOSITORY_PATHCHECK_BRANCH_NAMEを書き換えて、
サーバーの任意の場所に設置し、実行可能パーミッション( 755 など)にし、
実行してください。

他のシェルスクリプトに組み込む場合などはお好みで書き換えてください。

サンプルコード その1

checkBranchName.sh

#!/bin/bash
# config
REPOSITORY_PATH="${HOME}/hoge"
DENY_BRANCH_NAMES=("master" "main" "release" "staging")
cd "${REPOSITORY_PATH}" || exit 1
branch=$(git rev-parse --abbrev-ref HEAD) || exit 1
for deny_branch in "${DENY_BRANCH_NAMES[@]}"; do
  if [[ "$branch" == "$deny_branch" ]]; then
    echo "[NG] current branch \"$branch\" is in deny list"
    exit 1
  fi
done
echo "[OK] current branch \"$branch\" is not in deny list"
# 実行したいコマンドをここに書く
# ./deploy.sh など

サンプルコード その2(実用版)

これをローカル環境などで使う場合に、git commit や git pushを抑制したい場合は、次のようにします。

まず、ラッパースクリプトとして、

~/bin/git

に次の内容のスクリプトを作成します。

#!/bin/bash
# deny-check
REPOSITORY_PATH=$(git rev-parse --show-toplevel 2>/dev/null)
DENY_BRANCH_NAMES=("master" "main" "release" "staging")
DENY_COMMANDS=("commit" "push")
GIT_EXEC_PATH="/usr/bin/git"
# get sub command from first argument
GIT_SUBCOMMAND="$1"
# allow if command is not exists in deny list
should_check=false
for cmd in "${DENY_COMMANDS[@]}"; do
  if [[ "$GIT_SUBCOMMAND" == "$cmd" ]]; then
    should_check=true
    break
  fi
done
if ! $should_check; then
  exec "$GIT_EXEC_PATH" "$@"
fi
if [[ -d "$REPOSITORY_PATH" ]]; then
  cd "$REPOSITORY_PATH" || exit 1
  branch=$(git rev-parse --abbrev-ref HEAD) || exit 1
  for deny_branch in "${DENY_BRANCH_NAMES[@]}"; do
    if [[ "$branch" == "$deny_branch" ]]; then
      echo "[NG] current branch \"$branch\" is in deny list"
      exit 1
    fi
  done
fi
# exec git with arguments
exec "$GIT_EXEC_PATH" "$@"

次に、gitコマンドの在り処を調べます。

which git

この出力が、GIT_EXEC_PATH のところのパスと一致しているならば、そのままにしておき、異なる場合は書き換えましょう。

スクリプトの準備ができたら、実行パスをシェルに登録する必要があるため、次を実行します。

export PATH="$HOME/bin:$PATH"

そして、sourceコマンドでシェルに設定を反映します。

※ もしくは ~/.zshrc

source ~/.bashrc 

参考

ライセンスについて

  • サンプルスクリプトについて、ライセンスの表記など無しに、商用や非商用問わず、どなたでも無償で無制限に扱っていただいて構いません。
  • 作者または著作権者は使用や流用に関しての責任を一切負いません。