5098
実現したいことは、あるブランチで直接 `commit` することを禁止し、他のブランチからの `merge commit` のみを許すことです。例えば、
Gitflow で運用した時に `develop` ブランチへの直接 `commit` を禁止して、 `feature` や `release`
ブランチなどからの `merge commit` だけを認めることを開発メンバに強要したいといったケースです。

コミット前にチェックするための仕掛けとして `pre-commit` フックを使うのが最も自然だと思うんですが、実行されたのが `commit` か
`merge --no-ff` による `merge commit` かをフックスクリプト(hook
scripts)の中で区別する手段ってあるんでしょうか？

もしくは `pre-commit` フックを使わずに上記を実現する方法はあるんでしょうか？
CC BY-SA 3.0
2015-01-22T13:26:37.220
5091
2015-01-24T01:58:48.427
2015-01-24T01:58:48.427
151
151
question
git
Git のフックスクリプトで、単なる commit か merge commit かを区別出来るのか？
`pre-commit` フックを使用しない方法はちょっと分からないので，素直に `pre-commit` フックを使用した方法を示します．

`develop` ブランチへの `commit` を禁止するには， `.git/hooks/pre-commit` を

```

    #!/bin/sh    
    # Redirect output to stderr.
    exec 1>&2
    
    if [ "`git symbolic-ref HEAD | sed -e 's@^refs/heads/@@'`" = develop ]
    then
        echo "cannot commit on develop branch."
        exit 1
    fi
    
```

などとするとできます．

`git symbolic-ref HEAD` により `HEAD` が何であるか調べ， `develop` であれば `exit
1`で終了するという流れです．

参考ページにも詳しく書いてあるのですが，

  * `commit` の処理順序  
  

    1. `git commit` コマンドの実行
  

    2. `pre-commit` フックの実行
  

    3. デフォルトメッセージ生成
  

    4. `prepare-commit-msg` フックの実行
  

    5. コミットメッセージエディターが起動
  

    6. `commit-msg` フックの実行
  

    7. 実際にコミット生成
  

    8. `post-commit` フックの実行
  

  * `merge` の処理順序  
  

    1. `git merge` コマンドの実行
  

    2. `prepare-commit-msg` フックの実行
  

    3. 実際にマージの実行
  

    4. `post-merge` フックの実行
  

となっています．そのため， `pre-commit` フックを使用すれば `git merge` はそのまま実行でき， `git commit`
だけを実行禁止するか否かの判断ができます．

ちなみに， `git commit --no-verify` でフックは回避できてしまうので注意してください．

参考：

  * [Gitのフックの説明と挙動の検証](http://qiita.com/mima_ita/items/dcaa3789022d2a9ab929)
  * [Git hooks まとめ](http://qiita.com/khlizard/items/dfe1ec9d82c0ed5da7c6)
  * [Git-のカスタマイズ-Git-フック](http://git-scm.com/book/ja/v1/Git-%E3%81%AE%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%9E%E3%82%A4%E3%82%BA-Git-%E3%83%95%E3%83%83%E3%82%AF)
CC BY-SA 3.0
2015-01-22T15:12:07.233
5098
2015-01-23T16:49:27.100
2015-01-23T16:49:27.100
5447
5447
5091
answer