2012-03-09 11 views
13

gitを使って/ etcの変更を追跡することを計画していますが、コミットするときに変更を行う人に、コマンドラインで-authorオプションを使用します。pre-commitフックを使用して特定の作者によるgitコミットを停止する

私は偶然のコミットをrootとして止めたいと思います。

私はこのプリコミットフックを作成しようとしましたが、うまくいきません - コミットラインで作者を指定しても、git varはまだルートを返しています。

AUTHOR=`git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/\1/p'` 
if [ "$AUTHOR" == "root <[email protected]>" ]; 
then 
    echo "Please commit under your own user name instead of \"$AUTHOR\":" 
    echo 'git commit --author="Adrian"' 
    echo "or if your name is not already in logs use full ident" 
    echo 'git commit --author="Adrian Cornish <[email protected]>"' 
    exit 1 
fi 
exit 0 
+1

それは、この情報で取得する方法があるようには思えない驚きです。私は 'git var GIT_AUTHOR_IDENT'が' --author'で提供されたものではなく元の著者を示していることを確認できます... – Borealid

+0

接頭辞https://gist.github.com/tripleee/16767aa4137706fd896c – tripleee

答えて

10

Gitリポジトリの現在のバージョンは、環境変数、コマンドライン引数、または標準入力経由でGitのフックに--author情報を利用できるようにしません。しかし、代わりに--authorコマンドラインの使用を必要とする、あなたはGIT_AUTHOR_NAMEGIT_AUTHOR_EMAIL環境変数を設定するようにユーザーに指示することができます

#!/bin/sh 
AUTHORINFO=$(git var GIT_AUTHOR_IDENT) || exit 1 
NAME=$(printf '%s\n' "${AUTHORINFO}" | sed -n 's/^\(.*\) <.*$/\1/p') 
EMAIL=$(printf '%s\n' "${AUTHORINFO}" | sed -n 's/^.* <\(.*\)> .*$/\1/p') 
[ "${NAME}" != root ] && [ "${EMAIL}" != "[email protected]" ] || { 
    cat <<EOF >&2 
Please commit under your own name and email instead of "${NAME} <${EMAIL}>": 
GIT_AUTHOR_NAME="Your Name" GIT_AUTHOR_EMAIL="[email protected]" git commit 
EOF 
    exit 1 
} 

--author引数と同様に、これらの環境変数はのコミット作者を制御します。これらの環境変数はGit環境にあるため、pre-commitフックの環境にもあります。また、彼らはpre-commitフックの環境にいるので、のようにそれらを使用するgit var GIT_AUTHOR_IDENTに渡されます。

残念ながら、これらの変数を設定するのは、--authorを使用する場合よりもはるかに簡単です。 Git開発者に連絡して、pre-commitフックを起動する前にこれらの環境変数を設定するように要求します(--author経由で渡された値を使用します)。

+0

ありがとうございます欲しかった私はGIT_AUTHOR_NAMEとGIT_AUTHOR_EMAILにgit varを試しましたが、それは常に空白でした - これが理由を説明します。 –

+0

これは正しくないanylongerで、GIT 2.7.4(以前のmabye)でも動作するようです。 'pre-commit'フックに' echo $ GIT_AUTHOR_NAME'を置くと、作者名(git configで設定されたものか '--author'で渡されたもの)が表示されます。また 'git var GIT_AUTHOR_IDENT'は' --author'で動作するようです。 – lumbric

0

私は以下を使用し、これをシステム.bashrcに追加しました。

実際にルートにsuしてそのシェルに住んでいるフォークをキャッチしません。(悪い!) フォークだけでsudoを使用するときに便利です。 私は/ etcのchangelogをgitで保持しようとしています - だから、毎月何が行われているのか分かります。

#I want everyone to check in changes to /etc files, but also want their names even when they use sudo. 
export GIT_COMMITTER_EMAIL=${USER}@ourcompany.co.nz 
export GIT_AUTHOR_EMAIL=${USER}@ourcompany.co.nz 

https://serverfault.com/questions/256754/correct-user-names-when-tracking-etc-in-git-repository-and-committing-as-root

関連する問題