17

在我们的项目(托管在 GitHub 上)中,每隔一段时间就会有人不小心强制推送 master。没有人知道是否这样做,我想找出是谁做的,以及它背后的错误配置工具或坏习惯是什么。

那么问题来了,如何识别强制推送的用户呢?当我拉我看到这样的事情:

# git pull --prune
(.....)
 + 4c0d44c...138b9ed master     -> origin/master  (forced update)

138b9ed只是 origin/master 中的最新提交,任何人都可能在强制推送后提交;甚至有可能原力推动者本人没有做出任何事情,只是重新设定了基础,因此他的名字甚至没有出现在作为作者的起源/大师历史的重写部分中。

我也试过git reflog origin/master了,但它只是给出了相同的信息:有一条记录说git pull --prune (forced update)commit id 138b9ed,但这将再次将最后一个提交者提供给 master,而不是进行强制推送的那个。在源服务器上运行git reflog master可能会有所帮助,但 GitHub 并没有为您提供那种访问 AFAIK。

有没有可靠的方法来找出推送的来源(以及时间)?

4

2 回答 2

14

您可以将webhook添加到您的 Github 存储库,并让它将推送通知提交到某个服务器或诸如requestb.in 之类的服务。

通知负载有一个pusher密钥,用于标识用于推送更新的 Github 用户帐户。这样,您应该能够识别“坏人”。

编辑:有效载荷还有一个布尔forced键,它告诉你是否--force推送了偶数。它没有显示在 Github 的示例有效负载[截至 2013-07-06]中,但在另一个示例中可见。

编辑:这只是可能的,因为 Github 是一个集成的解决方案,它可以识别推送器并在 webhook 有效负载中提供该信息。使用纯 Git 服务器(例如,仅使用 SSH 进行授权)或不同的 Git 服务解决方案(Gitolite、Gitlab 等),这可能是不可能的。Git 本身无法识别推送的用户(Git 仅将用户信息保存在 commit 和 tag 对象中),因此该信息必须由连接的识别和授权部分提供(可以是 SSH 或 HTTPS 等) ; 它也可能完全丢失,例如在本地推送到同一文件系统上的存储库时)。

于 2013-07-06T13:05:48.347 回答
7

正如 GitHub刚刚在推特上提到的

让力量(推动)与你同在。

严重地。
来吧,强制推送到那个分支

https://pbs.twimg.com/media/DsJIVxtU4AAreMW.jpg:large

博文“强制推送时间线事件”提到:

当您强制推送到分支时,GitHub 现在会在您的拉取请求的“对话”时间线中显示强制推送事件

单击“强制推送”链接将显示两个提交之间的两点比较。

于 2018-11-16T18:45:17.323 回答