Gitフックを使用したmainブランチ直接Push防止の実装

Gitフックは、特定のGitイベント(コミット、プッシュなど)が発生したときに自動的に実行されるスクリプトです。これを利用することで、開発ワークフローにカスタムのルールを適用できます。ここでは、ローカル環境で main ブランチへの直接的な git push を禁止する方法を解説します。

pre-push フックの作成

pre-push フックは、git push コマンドがリモートリポジトリにデータを送信する直前に実行されます。このフックがゼロ以外の終了コードを返すと、プッシュ操作は中断されます。

  1. .git/hooks ディレクトリへの移動: Gitリポジトリのルートディレクトリで、.git/hooks ディレクトリに移動します。

    cd .git/hooks
    
  2. pre-push スクリプトの作成: pre-push という名前のファイルを作成し、以下の内容を記述します。

    #!/bin/bash
    
    # 現在のブランチ名を取得
    current_branch=$(git symbolic-ref HEAD --short)
    
    # もし現在のブランチが 'main' であれば、エラーメッセージを表示してプッシュを禁止
    if [ "$current_branch" = "main" ]; then
      echo "Error: Direct push to 'main' branch is not allowed."
      echo "Please create a new branch and open a pull request."
      exit 1 # ゼロ以外の終了コードを返すとプッシュが中断される
    fi
    
    # それ以外のブランチであれば、プッシュを許可
    exit 0
    
    • #!/bin/bash: スクリプトをBashで実行することを指定します。
    • git symbolic-ref HEAD --short: 現在のブランチ名を取得します。
    • if [ "$current_branch" = "main" ]; then ... fi: 現在のブランチが main であるかをチェックします。
    • echo "Error: ...": エラーメッセージを標準出力に表示します。
    • exit 1: プッシュ操作を中断します。
    • exit 0: プッシュ操作を続行します。
  3. 実行権限の付与: 作成したスクリプトに実行権限を付与します。

    chmod +x pre-push
    

これで、main ブランチにいる状態で git push を実行しようとすると、エラーメッセージが表示され、プッシュが拒否されるようになります。

注意点

  • ローカル環境のみ: Gitフックはローカルリポジトリにのみ適用されます。チーム開発で強制的にルールを適用したい場合は、サーバーサイドフック(例: GitHubのブランチ保護ルール)やCI/CDパイプラインでのチェックを組み合わせる必要があります。
  • フックのバイパス: git push --no-verify オプションを使用すると、Gitフックをバイパスしてプッシュできてしまいます。このため、フックはあくまで開発者のミスを防ぐための補助的なツールとして位置づけられます。

このフックを設定することで、誤って main ブランチに直接変更をプッシュしてしまうことを防ぎ、より安全な開発ワークフローを促進できます。