2

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


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

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

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

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


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

4

1 回答 1

0

你应该可以用post-rewritegit-hook 来做到这一点。这将获得标准输入上的重写提交列表,您可以检查您的遥控器。不幸的是,这只会给你一个错误,因为没有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
于 2015-10-20T15:46:29.260 回答