【问题标题】:How to make Git warn me about changing pushed commits?如何让 Git 警告我更改推送的提交?
【发布时间】:2016-01-19 08:14:44
【问题描述】:

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...。那么,检查相应的远程分支是否与我现在尝试修改的那个提交相同?


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

【问题讨论】:

    标签: git warnings git-commit git-amend


    【解决方案1】:

    你应该可以使用post-rewrite git-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
    

    【讨论】:

    • 既然我关心修改(这只适用于最后一次提交,对吧?),预提交钩子不会起作用吗?我对这个问题添加了更多想法。感谢你付出的努力! :D
    • 来自 git-scm.com “这个钩子由重写提交的命令调用(git commit --amend, git-rebase;目前 git-filter-branch 不调用它!)”。所以这个钩子会修正并警告你。如果你想中止提交,你确实需要做一个预提交钩子并做exit -1,如果你能找到一种方法来检测它。
    • 您还可以使用git branch -r --contains $(git show --no-patch --format=%H HEAD) 测试远程分支上是否存在最新的提交,但困难在于弄清楚您当前正在执行的操作,因为它自己会捕获常规提交和修改.
    猜你喜欢
    • 2013-02-13
    • 2014-07-13
    • 1970-01-01
    • 2012-04-28
    • 1970-01-01
    • 2013-06-09
    • 2017-07-04
    • 2011-06-29
    • 2017-04-20
    相关资源
    最近更新 更多