8

我四处搜索,发现了一些相关主题,但它们都与限制文件大小或存在配额有关。

我用 Gitolite 构建了一个 Git 服务器,供学生分享课程项目。这一切都在服务器上的一个用户名 git 下使用通配符存储库“projects/Creator/[a-zA-Z0-9].*”运行。存储库定义了 WRITERS 和 READERS,因此用户可以修改谁可以写入和读取其存储库。

实现了 SSH 密钥文件,因此用户可以通过以下方式创建存储库:

git clone git@servername.edu:projects/bob/project1 git clone git@xervername.edu:projects/bob/someotherproj

等等。“bob”文件夹是在他们第一次执行 git clone 时创建的(这是他们的用户名)。

我的问题是,作为学生,会有滥用行为,我需要限制“bob”文件夹的大小。磁盘配额不起作用,因为所有文件夹和文件都归 git 所有,而这已经受到限制。

我可能可以重新设计它以从他们的 Linux 主文件夹为他们的项目提供服务,从而能够使用磁盘配额,但是,我宁愿不必重新设计这个服务器,因为我已经让它工作了。

本质上,我一直在寻找一个类似于这个粗略的 shell 脚本的钩子:

foldersize=`du -s $GITPATH/projects/$USERNAME`
if [ $foldersize > 250000 ]; then
     echo "Quota Exceeded"
     exit 1
fi

我知道可以编写服务器端钩子,我想在开始雕刻之前查看轮子是否已经创建。那么,有任何限制存储库大小的钩子吗?

4

2 回答 2

4

gitpre-receive挂钩可用于实现配额。从githooks(5)手册页:

This hook is invoked by git-receive-pack on the remote repository,
which happens when a git push is done on a local repository. Just
before starting to update refs on the remote repository, the
pre-receive hook is invoked. Its exit status determines the success or
failure of the update.

因此,您可以将配额检查逻辑放在此脚本中,并根据结果允许或拒绝传入的更新。实际执行配额管理将是您的工作;有很多方法可以做到这一点,最简单的方法是依靠文件系统对用户配额的支持。

您当然可以使用您的du示例,尽管随着存储库大小的增加,这将为每次更新带来大量延迟(和 i/o 负担)。将此脚本的结果缓存一段时间可能会有所帮助,尽管这里的权衡显然是如果有人在缓存过期之前推送更新,他们可能会超过他们的配额。

根据您的存储的组织方式,您可以查看 git 存储库的每个目录配额(如果您的存储来自支持此功能的东西,例如大多数企业文件服务器),或者使用每个存储库的 LVM 卷(如建议的here)。

尽管有相反的建议,但为远程存储库实施配额是相当普遍的。大多数 git 托管服务会限制您的磁盘存储,并且一旦达到限制就会拒绝更新。

于 2012-06-06T14:36:31.260 回答
0

git 没有任何实现配额的功能。我不认为有任何理智的方式可以做到。当你达到配额时会发生什么?您将不再能够提交、从远程存储库获取更新或任何数量的其他维护类型活动。几乎“达到配额”===“存储库功能立即死亡”......

于 2012-06-06T14:12:09.293 回答