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

时间:2015-10-20 15:23:02

标签: git warnings git-commit amend

tl; dr:提交一些东西,推动它,修改该提交并尝试再次推送而不使用--force失败。当我尝试更改“已发布的提交”时,如何设置Git以便它告诉我?

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

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

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

编辑#1(约6小时后):不幸的是,我没有足够的信心尝试自己实现这一点,但也许有人帮助我:)我认为因为--amend仅影响最新的提交,所以只需要一个预提交钩子就可以检查我正在尝试修改的提交的哈希值,并将当前/最新的提交推送到远程提交。例如,目前我将b45025a...作为我本地计算机上最新的提交提交,我推送了它,cat .git/refs/remotes/<remote-name>/master也提供了b45025a...。那么,检查相应的远程分支是否与我正在尝试修改的那个进行相同的提交是否有效呢?

在写这篇文章之前,我问谷歌,并简要地查看了我在这里找到的问题,但似乎没有什么适合(选择):

1 个答案:

答案 0 :(得分:0)

您应该可以使用post-rewrite git-hook执行此操作。这将获得stdin上的重写提交列表,您可以根据您的遥控器进行检查。不幸的是,这只会给你一个错误,因为没有pre-rewrite挂钩。

编辑:有人质疑我把我的bash弄脏然后试试这个,所以这是一个工作警告:

#!/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