2012-07-18 52 views
6

我有一个中央git仓库,我自己和几个合作者经常推动和拉动。在过去,我犯了一个大的二进制blob意外,这需要rebasing完全删除,并为每个人都痛苦,所以我想在未来防止这种情况发生。是否可以在远程存储库中设置一个挂钩来检查被推送文件的文件大小(不管它们是否被添加新文件或更新现有文件)并拒绝超过阈值大小(例如2MB)的文件?如何防止在git中推入大的二进制blob?

重要的是,我希望现有的文件已经大于2MB,而且不会受到影响(因此,如果2MB文件已存在于存储库中,则推送不应被拒绝,只有推送添加2MB文件或增加现有文件文件为2MB)。另外,我希望钩子在远程端执行,所以我不必担心客户端不必设置钩子。

编辑:由于一个推式可以包含多个提交,甚至一个大文件的提交将其卡在回购协议中,我想要防止包含/任何提交/推动增加或增加> = 2MB文件。

回答

5

听起来像pre-receive hook将是这个检查的正确位置。该钩子在推送的服务器端执行,并且可以访问足够的信息来实现文件大小检查。

该钩子被调用混帐收到包的远程仓库,当混帐推是在当地的仓库中进行的恰好。在开始更新远程仓库中的refs之前,调用预接收钩子。其退出状态决定了更新的成败。

+0

对不起,看起来像我打算预先接收。我会更新。 – 2012-07-18 20:12:27

+0

预接收挂钩发生在“更新引用”之前,是否意味着它已经足够早地完成了,如果我有非零的退出,回购的大小不会增长,或者只是它不适用提交, blob还在那里被克隆?我想我读了后者,但是我找不到链接了:/ – 2012-07-18 20:21:26

+0

如果你没有通过预提交钩子,blob仍然会出现在服务器上,但这并不意味着它会被克隆。它不能从任何服务器的引用中获得,所以Git几乎不会理睬它。最终,Git的垃圾收集将删除未引用的blob。 – 2012-07-18 20:34:14