Gitフックは、特定のGitイベント(コミット、プッシュなど)が発生したときに自動的に実行されるスクリプトです。これを利用することで、開発ワークフローにカスタムのルールを適用できます。ここでは、ローカル環境で main
ブランチへの直接的な git push
を禁止する方法を解説します。
pre-push
フックの作成
pre-push
フックは、git push
コマンドがリモートリポジトリにデータを送信する直前に実行されます。このフックがゼロ以外の終了コードを返すと、プッシュ操作は中断されます。
-
.git/hooks
ディレクトリへの移動: Gitリポジトリのルートディレクトリで、.git/hooks
ディレクトリに移動します。cd .git/hooks
-
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
: プッシュ操作を続行します。
-
実行権限の付与: 作成したスクリプトに実行権限を付与します。
chmod +x pre-push
これで、main
ブランチにいる状態で git push
を実行しようとすると、エラーメッセージが表示され、プッシュが拒否されるようになります。
注意点
- ローカル環境のみ: Gitフックはローカルリポジトリにのみ適用されます。チーム開発で強制的にルールを適用したい場合は、サーバーサイドフック(例: GitHubのブランチ保護ルール)やCI/CDパイプラインでのチェックを組み合わせる必要があります。
- フックのバイパス:
git push --no-verify
オプションを使用すると、Gitフックをバイパスしてプッシュできてしまいます。このため、フックはあくまで開発者のミスを防ぐための補助的なツールとして位置づけられます。
このフックを設定することで、誤って main
ブランチに直接変更をプッシュしてしまうことを防ぎ、より安全な開発ワークフローを促進できます。