如何通过git-daemon拒绝特定仓库的浅克隆/浅拉取请求?
如何通过git-daemon拒绝特定仓库的浅克隆/浅拉取请求?
好问题!git daemon本身确实没有直接的内置配置项来拒绝特定仓库的浅克隆/浅拉取请求,但我们可以通过自定义upload-pack包装脚本的方式来实现这个需求——毕竟git daemon在处理克隆/拉取请求时,会调用git-upload-pack程序和客户端交互,我们可以把这个程序替换成自己的脚本,在里面做仓库判断和浅请求拦截。
下面是具体的实现步骤:
1. 编写自定义的upload-pack包装脚本
创建一个脚本文件,比如/usr/local/bin/git-upload-pack-wrapper,内容如下:
#!/bin/bash # 获取git daemon传递的当前仓库绝对路径 REPO_PATH="$1" # 定义需要禁止浅克隆的仓库列表(替换成你实际的仓库路径) FORBIDDEN_REPOS=( "/srv/git/platform/frameworks/base.git" "/srv/git/platform/packages/apps/Settings.git" # 继续添加其他需要限制的仓库路径 ) # 检查当前请求的仓库是否在禁止列表中 for repo in "${FORBIDDEN_REPOS[@]}"; do if [ "$REPO_PATH" = "$repo" ]; then # 检查客户端是否发起浅请求:现代Git客户端(2.18+)会在GIT_PROTOCOL中携带shallow标识 if [[ "$GIT_PROTOCOL" == *"shallow"* ]]; then echo "Error: Shallow clones/fetches are not allowed for this repository." >&2 exit 1 fi # 如果需要兼容旧版本Git,可以进一步读取标准输入的请求内容,检查是否包含shallow/deepen指令 # 不过对于公共镜像来说,现代客户端占比很高,用GIT_PROTOCOL基本足够覆盖需求 break fi done # 若不在禁止列表或无浅请求,调用真正的git-upload-pack处理请求 exec /usr/lib/git-core/git-upload-pack "$@"
给脚本添加执行权限:
chmod +x /usr/local/bin/git-upload-pack-wrapper
2. 修改git daemon的systemd配置
打开你的git daemon服务配置文件,修改ExecStart行,添加--upload-pack参数指定我们的包装脚本:
原来的配置:
ExecStart=/usr/lib/git-core/git-daemon --user=gitdaemon --reuseaddr --verbose --export-all --forbid-override=receive-pack --timeout=180 --max-connections=32 --base-path=/srv/git
修改后:
ExecStart=/usr/lib/git-core/git-daemon --user=gitdaemon --reuseaddr --verbose --export-all --forbid-override=receive-pack --timeout=180 --max-connections=32 --base-path=/srv/git --upload-pack=/usr/local/bin/git-upload-pack-wrapper
3. 重启git daemon服务
应用配置更改并重启服务:
systemctl daemon-reload systemctl restart git-daemon.service
额外说明
- 测试效果:你可以用
git clone --depth 1 http://your-mirror-url/platform/frameworks/base.git来测试,应该会收到我们脚本里定义的错误提示,无法完成浅克隆。 - 配合你的内存限制:禁止浅克隆后,能减少git daemon处理大量零散小对象的压力,再加上你已经配置的
MemoryMax和MemoryHigh,应该能有效缓解之前的CPU和内存占用问题。
备注:内容来源于stack exchange,提问作者iBug
相关产品推荐
相关产品推荐

