Git仓库大小和git push大小

4
我们已经为我们的Git仓库(将作为远程仓库在云上)设置了配额限制。我们必须在此限制内限制仓库的大小。
为此,我正在尝试在远程仓库的pre-receive hook中获取“git push”的大小。如果我得到push的大小,我将把目前git仓库的大小与这个push的大小相加,以找出推送后总仓库大小将是多少。然后,如果总大小超过配额,我可以限制推送;如果大小没有超过配额,我可以接受推送。
基本上,我需要在pre hook中计算git远程仓库的大小和git push的大小。

2
你有否针对拒绝推送后的行动计划?git rm 只会从文件系统中移除大文件,而不是从对象中移除,因此下一次推送仍会尝试将它们推送上去。 - deejayy
2个回答

0
这是一个脚本,可以用作服务器上存储库的 pre-receive 钩子,并限制存储库当前大小和传入推送的最大大小:
    set -e
    GIT=/usr/bin/git
    MAXSIZE=1024 # size in KB
    EXIT=0
    size=$(du -s | cut -f 1)
    human_size=$(du -sh | cut -f 1)
    if [ ! -z "${size}" ]; then
        if [ ${size} -gt ${MAXSIZE} ]; then
            echo "Push will make repository size ${human_size} which is more than ${MAXSIZE}KB, rejecting"
            exit 1;
        fi
    else
        echo "could not determine repository size, rejecting push"
        exit 1;
    fi

请注意,这个方法可以计算仓库大小和传入的推送数据大小,因为在 pre-receive 钩子中,传入的数据会被存储在仓库文件夹内的隔离文件夹中,详见 文档

当 receive-pack 接收到对象时,它们会被放置在 $GIT_DIR/objects 目录下的临时“隔离”目录中,并且只有在 pre-receive 钩子完成后才会迁移到主对象存储中。如果推送在此之前失败,则整个临时目录将被删除。

由于钩子的工作目录是仓库本身,所以运行 du -s 即可。

0

实现这个的最可靠方法是:

  • 将其推送到本地仓库
  • 在推送后检查该本地仓库的大小
  • 如果大小符合您的限制,那么将其推送到云端的远程仓库。

让我们考虑公司A在云中托管了一个1 GB的Git repo。用户B在此云中创建了一个Git repo,并将其克隆到本地机器上。完成工作后,B将更改推送到云中的远程repo。公司A想要验证存储库配额。如果用户通过此次推送尚未达到配额,则可以接受该推送;否则,公司应拒绝该推送。在这种情况下,公司如何访问用户的本地repo? - Mani
@Mani:你能在云端创建另一个临时仓库吗?B可以往里面推送,A可以克隆,检查大小并推送到官方A仓库。 - VonC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接