可以预先接收挂钩编辑提交吗?

时间:2015-12-18 13:51:48

标签: git bash githooks git-bash

我正在构建一个预接收挂钩来检查作者的姓名和电子邮件地址。

我可以使用

轻松检查提交的名称/电子邮件地址
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或者更新钩子里完成这个?

1 个答案:

答案 0 :(得分:2)

ANKIT,

我理解你想要编辑提交以纠正似乎是可恢复的&#34;错误。修改提交authorsip并不是解决问题的方法。由于更改提交作者会更改提交的SHA-1,因此只要按下提交,本地分支和远程之间的提交历史就会不同。这绝对不是你想要的。

更好的解决方案(当然,如果它在您的情况下是实用的)将是向开发人员git repos添加本地prepare-commit-msg和/或commit-msg挂钩。然后,您可以在处理提交之前更改提交消息。这将解决历史重写问题。不幸的是,你不能强迫远程开发人员使用钩子(git commit --no-verify将绕过提交检查)。

因此,我建议采用组合方式。通过在推送提交之前提供本地钩子来检查和纠正作者问题,可以轻松获得电子邮件地址。然后,添加服务器挂钩以防止推送无效或未授权作者的提交。遵循您的回购规则的开发人员不会感到不便(除了添加挂钩),并且您的远程仓库不会被未经授权的提交作者填充。

在相关的说明中,为什么要检查未经授权的作者,如果您要做的就是将作者更新为默认值&#34;有效&#34;作者?