在执行 git 提取或 git 拉取时,如何在客户端拒绝 GIT 的强制更新?

How to reject a forced update by GIT on client side when doing a git fetch or git pull?

在执行 git fetchgit pullgit pull --rebase 时,可以通过设置 receive.denyNonFastForwards or by adding a git hook (or in a different way for special GIT servers like Gerrit or Github). I would like to reject a forced update on client side (see also here) 拒绝服务器端的强制推送。如果我无法访问 GIT 服务器以拒绝强制推送(或者如果我不信任该服务器,因为其他人也可以访问),我可能希望 GIT 在出现错误之前停止强制推送完成后更改任何引用。这可能有助于注意到攻击者更改遥控器,或者如果我只是想知道是否有人更改了我的提交(是的,如果我真的想避免其他人使用我的名字提交,我需要使用我的密钥签署我的提交)。

我似乎无法在 fetch or pull 命令后使用挂钩 运行 编码。我解析 git fetch 的输出并在打印 "forced update" 时引发错误。但实际上最好在 refs 更改之前检测到这一点。

有更好的方法吗?

编辑 git 配置中的 remote.fetch 行以从中删除“+”,然后非快进提取将失败。虽然它不保护分支移除

很好,但请注意,当您只想 检查 本来 fetched/pulled 的内容时,您可以这样做,无需任何配置 hack , 去干 运行 :

git fetch --dry-run

并且您将看到 是什么,而无需修改您的远程跟踪分支中的任何内容。

没有类似的 pull 技巧,但是由于 pull 是一个 fetch + 一个 merge,所以事先进行 dry-运行 fetch,你就会知道会被拉取什么。


正如下面评论中 正确指出的那样,此技术的限制是它的非原子性:远程状态可能会在您的 fetch --dry-run 和几秒钟后的真实状态之间发生变化。无论如何,知道它的存在没有坏处。