gitでコンフリクトマーカーが入ったままの状態ではターミナルからコミットできないようにする設定

ターミナルでgitを操作しているとき、コンフリクトマーカー(<<<<<<<とか=======とか>>>>>>>ね)が残っていたらコミットできないようにする設定の紹介。

まぁこんなアホなことをやっちゃう人はめったにいないのか?gitのオプションにはそれらしきものはなく、日本語ではそれっぽい記事が検索でヒットしなかったのでさらに検索の範囲を広げたところ、以下の方法が良さそうでした。

上のページの手順は、

  1. 上記ページのpre-commitファイルをローカルのgitリポジトリ/.git/hooks/pre-commitにコピー
  2. このpre-commitファイルに実行権限を与える(chmod u+x pre-commit)

だけです。

上記ページの埋め込み元のgistがなぜかsecret(private)なのでここでは引用しませんが、見て分かるようにコンフリクトマーカーがあったらコミットを中止する簡単なシェルスクリプトです。

で、こうすると、コミット時にコンフリクトマーカーが残っていたらコミットが中止され、警告メッセージが表示されるようになります。

わたしの場合、上のJonさんの方法にプラス、「=======」も対象にしたかったので17行目の

echo $changed | xargs egrep '[><]{7}' -H -I --line-number

echo $changed | xargs egrep '[>=<]{7}' -H -I --line-number
にして、全部のローカルリポジトリで摘要したかったので、

を参考に
$ git config --global init.templatedir '~/.git_template'
として~/.git_template/hooks/pre-commitに置いています。

これで新規にcloneする場合は自動的にこのpre-commitファイルが.git/hooks/にコピーされます。

既存のリポジトリの場合はgit initとするとこのpre-commitが.git/hooks/にコピーされます。

ちなみに、既存のリポジトリでgit initしても安全です 😉

Running git init in an existing repository is safe. It will not overwrite things that are already there. The primary reason for rerunning git init is to pick up newly added templates (or to move the repository to another place if –separate-git-dir is given).

https://git-scm.com/docs/git-init

ではでは!