如何修改SSH服务器上Git仓库的存储路径
如何修改Git/SSH仓库存储路径,让
git@git.example.com:repo-name.git指向/srv/git/repo-name.git 方法1:修改git用户的主目录(最简单直接)
SSH默认会以登录用户的主目录作为仓库查找的根路径,直接修改git用户的主目录即可实现路径切换:
- 创建目标目录并设置正确权限:
sudo mkdir -p /srv/git sudo chown git:git /srv/git
- 迁移现有仓库到新目录:
sudo mv /home/git/*.git /srv/git/
- 修改
git用户的主目录:
sudo usermod -d /srv/git git
完成后,git@git.example.com:repo-name.git会自动指向/srv/git/repo-name.git,客户端无需做任何配置修改。
方法2:通过SSH的ForceCommand做路径映射(不修改主目录)
如果不想改动git用户的主目录,可以通过SSH配置拦截Git命令,替换仓库路径:
- 创建路径代理脚本
/usr/local/bin/git-repo-proxy:
#!/bin/bash # 提取SSH命令中的仓库名称 REPO=$(echo "$SSH_ORIGINAL_COMMAND" | sed -n "s/.*'\([^']*\)'/\1/p") if [ -z "$REPO" ]; then exec git-shell -c "$SSH_ORIGINAL_COMMAND" fi # 构建新的仓库路径 NEW_REPO="/srv/git/$REPO" if [ -d "$NEW_REPO" ]; then # 替换命令中的仓库路径并执行 MODIFIED_CMD=$(echo "$SSH_ORIGINAL_COMMAND" | sed "s/'$REPO'/'$NEW_REPO'/") exec git-shell -c "$MODIFIED_CMD" else echo "Repository '$REPO' not found in /srv/git" >&2 exit 1 fi
- 给脚本添加执行权限:
sudo chmod +x /usr/local/bin/git-repo-proxy
- 编辑SSH服务器配置
/etc/ssh/sshd_config,添加规则:
Match User git ForceCommand /usr/local/bin/git-repo-proxy AllowTCPForwarding no X11Forwarding no
- 重启SSH服务生效:
sudo systemctl restart sshd
方法3:创建符号链接(临时过渡方案)
如果只是临时迁移需求,不想修改用户或SSH配置,可以在原主目录下创建软链接指向新路径:
# 单个仓库链接 ln -s /srv/git/repo-name.git /home/git/repo-name.git # 批量处理所有仓库 for repo in /srv/git/*.git; do ln -s "$repo" /home/git/$(basename "$repo") done
该方案的缺点是原/home/git目录会保留链接文件,不如前两种方案彻底。
相关配置说明
- Git本身没有直接控制该存储路径的配置项,仓库路径的解析由SSH登录后的用户环境决定。
- SSH的
ForceCommand是核心配置,用于拦截git用户的所有SSH命令,实现路径映射。 - 修改用户主目录是利用SSH默认的起始目录特性,让Git自动在新主目录下查找仓库。
内容的提问来源于stack exchange,提问作者izrik
相关产品推荐
相关产品推荐

