16261


共有PC内でユーザ名とメールアドレスに他人の物が設定されていることに気づかずにコミットすることを避けるため、以下のようなフックスクリプトを作成しました。  
<https://github.com/DaikiMaekawa/git-commit-checker>

これにより、コミットする毎に設定されているユーザ情報が正しいかどうか確認することができます。

しかし、git
commitに`--author`オプションが指定されている時にはこの機能を無効にしたいのですが、フックスクリプト内でその判定を行うにはどうすれば良いでしょうか?


CC BY-SA 3.0
2015-09-03T12:01:15.003
15200
2015-09-05T06:55:15.607
2015-09-03T20:04:44.853
10492
11187
question
python git
Git hook script内でコマンドのオプションを取得したい


`git commit` に `--author` が指定されたかどうかを直接的に判定する方法は無いと思います。

間接的には環境変数をチェックする方法が考えられます。フックスクリプト内において、環境変数 `GIT_AUTHOR_NAME` と
`GIT_AUTHOR_EMAIL` には最終的にコミットに含まれるユーザ情報がセットされます。 `git commit` に `--author`
が指定されていればその値がセットされ、そうでなければ gitconfig の値が反映されます。

フックスクリプト内で `GIT_AUTHOR_NAME`, `GIT_AUTHOR_EMAIL` の値を `git config user.name`,
`git config user.email` と比較し、異なっていれば `--author` が指定されたと考えればよさそうです。


CC BY-SA 3.0
2015-09-04T09:36:46.467
16246
2015-09-04T09:36:46.467
2259
15200
answer


お使いのシステムが **Linux 系 OS であれば** 方法があります。

Linux では `/proc/PID/cmdline` から、プロセスのコマンドライン引数を取得することが可能です。ですので、`pre-commit`
スクリプト(プロセス)の親プロセスである git のコマンドライン引数を調べることによって `--author`
オプションが指定されているのかどうかを知ることができます。

**pre-commit**

[code]

    #!/usr/bin/env python
    
    import os
    import sys
    
    ppid = os.getppid()
    cmdline = open('/proc/' + str(ppid) + '/cmdline', 'r').readline()
    
    if '\x00--author' in cmdline:
      print "--author option specified."
    else:
      print "--author option not specified."
    
    sys.exit(0)
    
[/code]

`\x00--author` となっているのは、引数が `NULL(\x00)` で区切られているためです。

**追記**

psutil というライブラリがあって、上記と同等の処理を Linux 以外の環境でも実現できることが判りました。

[giampaolo/psutil](https://github.com/giampaolo/psutil)

> It currently supports Linux, Windows, OSX, FreeBSD and Sun Solaris, both
> 32-bit and 64-bit architectures, with Python versions from 2.6 to 3.5.

psutil を利用する場合の `pre-commit` スクリプトは以下の様になります。

[code]

    #!/usr/bin/env python
    
    import os
    import sys
    import psutil
    
    cmdline = '\x00'.join(psutil.Process(os.getppid()).cmdline())
    
    if '\x00--author' in cmdline:
      print "--author option specified."
    else:
      print "--author option not specified."
    
    sys.exit(0)
    
[/code]


CC BY-SA 3.0
2015-09-04T14:42:47.693
16261
2015-09-05T06:55:15.607
2015-09-05T06:55:15.607
15200
answer