预接收钩子能否编辑提交?

3

我正在构建一个 pre-receive 钩子,用于检查作者的名称和电子邮件地址。

我可以轻松地使用以下方法检查提交的名称/电子邮件地址:

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或可能的update钩子中完成此操作?

1个回答

4

Ankit,

我理解你想要编辑提交以更正似乎可以“恢复”的错误的动机。修改提交作者不是解决问题的方法。因为更改提交作者会更改提交的SHA-1值,一旦提交被推送,本地分支和远程之间的提交历史将不同。这绝对不是你想要的结果。

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

因此,我建议采用组合方法。通过提供本地钩子来检查和纠正作者问题,使正确填写电子邮件地址变得容易,然后添加服务器钩子以防止具有无效或未授权作者的提交被推送。遵循你的存储库规则的开发人员将不会受到不便(除了添加钩子),而你的远程存储库也不会被未经授权的提交作者占据。

顺便说一句,如果你最终要将作者更新为某个默认的“有效”作者,为什么要费心检查未经授权的作者呢?


1
这不是关于重写提交信息的问题,而是关于重写提交作者元数据的问题。 - undefined
无论您更改提交消息还是提交元数据,原始问题仍然存在。您最终会得到一个新的提交SHA-1。我修改了我的答案以反映作者的更改而不是提交消息的更改。 - undefined
@MichaelMilom 如果我理解错了,请纠正我,如果我改变提交作者,它会导致不同的SHA-1,因此与本地的历史不同。这意味着什么?开发人员是否需要每次都从远程拉取以保持同步? - undefined
我考虑过使用组合,可能是与pre-commit或prepare-commit一起使用,但正如你所说的那样,它只在本地生效,并且可以很容易地通过no-verify跳过。这就是为什么我尽可能地想在服务器端完成这个任务。 - undefined
服务器上停止提交的想法是为了强制开发人员修复问题,如果他们选择忽略本地钩子。除此之外,我不知道其他实现你想要的目标的方法。如果这样可以的话,请接受答案(如果你不介意的话)。谢谢! - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接