我正在构建一个预接收挂钩来检查作者的姓名和电子邮件地址。
我可以使用
轻松检查提交的名称/电子邮件地址while read oldsha newsha refname; do
authorEmail=$(git log -1 --pretty=format:%ae $newsha)
if [[ $(grep -w $authorEmail ~/.ssh/authorized_keys | wc -w) -gt 1 ]]; then
echo "Author Email: $authorEmail"
exit 0
else
echo "Unauthorized Email"
exit 1
fi
done
但我不想简单地拒绝它,而是想用正确的电子邮件替换电子邮件。 我已经设置了这样的authorized_keys,
environment="UserEmail=user@hostA" ssh-rsa AAAAAA... user@hostA
所以我想按照
的方式做点什么if [[ ... ]];
then
echo "Author Email: $authorEmail"
exit 0
else
echo "Unauthorized Email detected"
echo "Replacing email with: $UserEmail"
git commit --amend --author "something <$UserEmail>"
exit 0
fi
但正如预期的那样,git commit --amend ..抛出一个错误,应该在工作树中使用它。 有没有什么办法可以在pre-receive或者更新钩子里完成这个?
答案 0 :(得分:2)
ANKIT,
我理解你想要编辑提交以纠正似乎是可恢复的&#34;错误。修改提交authorsip并不是解决问题的方法。由于更改提交作者会更改提交的SHA-1,因此只要按下提交,本地分支和远程之间的提交历史就会不同。这绝对不是你想要的。
更好的解决方案(当然,如果它在您的情况下是实用的)将是向开发人员git repos添加本地prepare-commit-msg和/或commit-msg挂钩。然后,您可以在处理提交之前更改提交消息。这将解决历史重写问题。不幸的是,你不能强迫远程开发人员使用钩子(git commit --no-verify
将绕过提交检查)。
因此,我建议采用组合方式。通过在推送提交之前提供本地钩子来检查和纠正作者问题,可以轻松获得电子邮件地址。然后,添加服务器挂钩以防止推送无效或未授权作者的提交。遵循您的回购规则的开发人员不会感到不便(除了添加挂钩),并且您的远程仓库不会被未经授权的提交作者填充。
在相关的说明中,为什么要检查未经授权的作者,如果您要做的就是将作者更新为默认值&#34;有效&#34;作者?