防止`git`推送带有特定提交信息的提交

12
如何防止 git 推送包含给定字符串(例如“DO NOT PUSH”)的提交消息?
上下文/用例:
我的典型工作流程是:我编写代码,将工作拆分为微小的提交,一旦事情变得可行,我会重写历史记录,改变提交顺序以合理地组织它们,并稍后压缩成更有意义的大块。一旦工作准备好,就可以推送了!
现在,我希望 git 防止我意外地推送仍处于进展中的提交。我考虑将“DO NOT PUSH”保留为提交消息的一部分。如何使 git 在 git push 到达此类提交时自动阻止我推送呢?
(对于 pre-receive hook 解决方案:让我们以 github 作为示例服务,据我所知,除了其“企业版”之外,不允许 pre-recevie 钩子。)

git stash 对你来说不是一个好的选择吗? - michalronin
答案中是否有任何遗漏? - VonC
我有多个分支和多个草稿微提交,我在上面工作:测试它们,比较它们等等。git rebase -i 是对我最有效的东西。一旦我达到所需的形状,我就会编辑和压缩提交。 - Grzegorz Wierzowiecki
为什么不适合使用 pre-push? - VonC
只需要一点时间再仔细看一遍 :) 谢谢! - Grzegorz Wierzowiecki
1个回答

10

您可以使用pre-push hook,但这仍然是一种本地hook,可以被绕过。
请参阅此pre-push示例,该示例确实查看每个提交消息

# Check for foo commit
        commit=`git rev-list -n 1 --grep '^foo' "$range"`
        if [ -n "$commit" ]
        then
echo "ERROR: git pre-push hook found commit message starting with 'foo' in $local_ref"

但是最好的方法仍然是在服务器端使用pre-receive钩子。这样,政策就会对所有贡献者强制执行。当您无法直接访问远程服务器(如GitHub、BitBucket或GitLab.com)时,这并不总是可能。


@Leon 确定,已添加。 - VonC
如上所述,这是正确的答案,但验证也必须在服务器端进行。任何开发人员都可以禁用本地钩子,因此您必须在服务器上进行验证。您需要验证的唯一事项是答案使用“-n 1”,这将仅检查最后一次提交,因此您需要在所有提交中执行此操作,因为用户可能会一次推送多个提交。 - CodeWizard

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