如何让Git警告我更改推送提交?

如何让Git警告我更改推送提交?,git,warnings,git-commit,git-amend,Git,Warnings,Git Commit,Git Amend,tl;dr:提交某个内容、推送该内容、修改该提交内容并尝试再次推送而不使用--force失败。如何设置Git,以便在我尝试更改“已发布的提交”时,它能告诉我 我使用Git已经有一段时间了,它仍然是我所经历过的最好的事情之一(软件方面):它完全支持我开箱即用的方式。就在昨天,我做了一件愚蠢的事情:我提交了一些东西,把它推到我的遥控器上,离开工作几分钟。当我回来时,我注意到我在添加了一个文件后更改了它,因此提交没有完成。像往常一样,我使用了git commit--amend来解决这个小问题 我工作

tl;dr:提交某个内容、推送该内容、修改该提交内容并尝试再次推送而不使用
--force
失败。如何设置Git,以便在我尝试更改“已发布的提交”时,它能告诉我


我使用Git已经有一段时间了,它仍然是我所经历过的最好的事情之一(软件方面):它完全支持我开箱即用的方式。就在昨天,我做了一件愚蠢的事情:我提交了一些东西,把它推到我的遥控器上,离开工作几分钟。当我回来时,我注意到我在添加了一个文件后更改了它,因此提交没有完成。像往常一样,我使用了
git commit--amend
来解决这个小问题

我工作了几个小时,决定再推一次
git
。令我沮丧的是,git拒绝了这一点,并阅读了这条信息,向后滚动了数千行,我看到了我所做的事情,知道发生了什么。远程基本上只是一个私有的非现场备份,没有其他人使用它来推拉。因此,我没有遇到任何人使用
gitpush--force
重写历史的麻烦。由于我不希望在多用户环境中发生这种情况(清理我的历史记录或强制推送),我考虑了如何在将来防止这种情况:Git可以发出一个清晰可见的警告,甚至可能要求我键入一些内容。我会注意到并可能决定不修改

所以,问题是:如何配置Git来警告我修改已经推送的提交?或者更一般地说:如何配置Git来警告我更改已发布的历史记录

编辑#1(~6小时后):不幸的是,我没有足够的信心尝试自己实现这一点,但也许有人可以帮助我:)我想既然
--amend
只影响最新提交,有一个pre-commit钩子就足够了,它可以检查我试图修改的提交的散列以及推送到远程的当前/最新提交的散列。例如,目前我在本地机器上获得了
b45025a…
作为对master的最新提交,我推送了它,并且
cat.git/refs/remotes//master
也给出了
b45025a…
。那么,检查相应的远程分支是否与我现在试图修改的分支处于同一提交状态是否有效


在写这篇文章之前,我问了谷歌,也简单地看了一下我在这里发现的问题,但似乎没有什么是合适的(选择):


您应该能够通过一个
后期重写
git钩子来实现这一点。这将获得stdin上重写的提交列表,您可以对照远程设备进行检查。不幸的是,这只会给您一个错误,因为没有
pre-rewrite
hook

编辑:有人向我挑战,让我掸掉身上的灰尘,试试这个,所以这里有一个有效的警告:

#!/bin/sh
#
# Place this in the file .git/hooks/post-rewrite and make executable
#
# An attempt to write a git-hook to warn of rewritten commits on remotes

while read -r commit junk; do
  if [ ! -z "$(git branch -r --contains $commit)" ]; then
    echo "############################### WARNING ###############################"
    echo "$commit has been rebased but exists on these remote branches"
    echo $(git branch -r --contains $commit)
    echo "You may want to rethink this rewrite"
  fi
done

既然我关心的是修改(这只适用于最后一次提交,对吗?),那么预提交钩子难道不起作用吗?我对这个问题补充了一些想法。谢谢你的努力!:DFrom git-scm.com“这个钩子由重写提交的命令调用(git commit--amend,git rebase;当前git过滤器分支不调用它!)”。所以这个钩子会抓住补偿并警告你。如果您想中止提交,您确实需要执行预提交钩子,如果您能找到检测它的方法,则需要执行
exit-1
。此外,您还可以使用
git branch-r--contains$(git show--no patch--format=%H HEAD)测试远程分支上是否存在最新提交
但困难在于找出您当前正在执行的操作,因为此操作本身会捕获定期提交和修改。