Bitbucket v5.7自动Git GC拖慢服务器性能,如何管控执行时机?
针对你在Bitbucket Server v5.7上推送20GB大仓库时,自动触发Git GC导致服务器性能暴跌的问题,完全可以通过配置调整来管控这个进程的执行时机,甚至直接禁用自动触发改为定时执行——下面是亲测有效的具体方法:
一、彻底禁用Git自动触发GC
Git本身会在推送、合并等操作时,根据仓库的对象数量、打包情况自动触发GC。要关掉这个自动触发机制,可以从单仓库或全局层面配置:
针对单个问题仓库
SSH到Bitbucket Server所在的服务器,进入目标仓库的.git目录(通常路径是/var/atlassian/application-data/bitbucket/shared/data/repositories/[仓库ID]/.git),执行以下命令:git config gc.auto 0 git config gc.autopacklimit 0gc.auto 0:关闭基于对象数量阈值的自动GC触发gc.autopacklimit 0:关闭自动打包触发的GC逻辑
全局生效(所有仓库)
如果想让所有仓库都禁用自动GC,执行全局Git配置命令:git config --global gc.auto 0 git config --global gc.autopacklimit 0注意:修改全局配置后,需要重启Bitbucket Server服务才能让新配置生效。
二、改为定时执行Git GC(推荐低峰时段)
禁用自动GC后,必须定期执行GC来避免仓库体积过度膨胀。最稳妥的方式是用系统定时任务,在非工作时段批量执行:
编写批量GC脚本
创建一个脚本文件(比如bitbucket_gc.sh),内容如下(记得替换成你的仓库存储实际路径):#!/bin/bash # Bitbucket仓库根目录,根据你的部署路径修改 REPO_ROOT="/var/atlassian/application-data/bitbucket/shared/data/repositories" # 遍历所有仓库执行GC for repo_path in "$REPO_ROOT"/*; do if [ -d "$repo_path/.git" ]; then echo "[$(date)] Running GC on repo: $repo_path" # --aggressive 深度清理,--prune=now 立即清理过期对象 git -C "$repo_path" gc --aggressive --prune=now fi done给脚本添加执行权限:
chmod +x bitbucket_gc.sh配置Cron定时任务
用crontab -e编辑服务器的定时任务,添加如下规则(比如每周日凌晨2点执行,根据你的非工作时段调整):0 2 * * 0 /path/to/bitbucket_gc.sh >> /var/log/bitbucket_gc.log 2>&1这样GC就会在业务低峰期自动运行,完全不会影响日常使用。
三、调整Bitbucket内置的定期GC任务
除了Git自身的自动GC,Bitbucket Server v5.7还有内置的定期GC任务。你可以直接修改这个任务的执行时间,让它只在非工作时段运行:
- 登录Bitbucket的管理员后台,进入Administration > Scheduled Tasks
- 找到名为
Git Repository Garbage Collection的任务 - 点击任务右侧的「Edit」按钮,把执行时间改成你的非工作时段(比如凌晨1点到3点之间)
- 保存设置即可
这个方案适合不想完全禁用自动GC,只是想调整执行时机的场景。
内容的提问来源于stack exchange,提问作者Yael

