本文介绍如何在 Debian 系统上通过原生 SSH 与 Git 裸仓库(Bare Repository)快速搭建轻量、安全、支持多人提交的私有 Git 服务器,并完成权限隔离与 SSH 免密认证配置。
1. 服务端环境准备
以 root 或具备 sudo 权限的用户登录 Debian
服务器。
1.1 安装 Git
1 | sudo apt update |
1.2 创建专用的 git 用户
为了环境安全与权限隔离,避免直接使用 root
账户托管代码仓库:
1 | sudo adduser --disabled-password --gecos "" git |
2. 配置 SSH 公钥认证
Git 客户端主要通过 SSH 协议与公钥认证进行安全通信。
2.1 初始化 git 用户的
SSH 目录
1 | sudo -u git mkdir -p /home/git/.ssh |
2.2 导入客户端公钥
在本地开发机上获取 SSH 公钥(通常为
~/.ssh/id_ed25519.pub 或
~/.ssh/id_rsa.pub):
1 | # 本地终端执行(若尚未生成 SSH Key 可先生成) |
将打印出的公钥内容追加到服务器的
/home/git/.ssh/authorized_keys 文件中:
1 | # 在服务器端执行(替换其中的公钥字符串) |
3. 创建远程裸仓库(Bare Repository)
作为中央远程仓库,必须创建为裸仓库(不包含工作区文件树,仅维护版本历史、分支引用与对象数据库)。
3.1 创建集中存放仓库的目录
1 | sudo mkdir -p /srv/git |
3.2 初始化目标仓库(例如
my-project.git)
1 | sudo -u git git init --bare /srv/git/my-project.git |
4. 限制 git 用户的 Shell 权限(安全加固)
默认情况下,git 用户如果能登录交互式 Shell
会带来不必要的系统安全风险。可将其登录 Shell 替换为
git-shell,限制其仅能执行 Git 相关操作(如
git-receive-pack、git-upload-pack)。
4.1 检查并切换 Shell
1 | which git-shell |
安全效果验证:修改后,若客户端尝试直接
ssh git@your_server_ip登录交互式终端,连接将被拒绝并提示:fatal: Interactive git shell is not enabled.但此时 Git 的clone、push、pull均可正常通信。
5. 本地客户端连接与提交测试
在本地开发机上测试连接并推送代码。
5.1 场景 A:已有本地 Git 项目推送到远程
1 | cd /path/to/local/project |
5.2 场景 B:克隆空仓库到本地
1 | git clone git@your_server_ip:/srv/git/my-project.git |
6. 常见问题排查与进阶技巧
6.1 自定义 SSH 端口处理
若服务器的 SSH 守护进程运行在非标准端口(如
2222),可以在本地 ~/.ssh/config 中配置别名:
1
2
3
4
5Host my-debian-vps
HostName your_server_ip
Port 2222
User git
IdentityFile ~/.ssh/id_ed255191
git remote add origin my-debian-vps:/srv/git/my-project.git
6.2 权限错误(Permission denied)
若推送时出现权限报错,请确保裸仓库所有权归属于 git
用户: 1
sudo chown -R git:git /srv/git/my-project.git
6.3 自动化部署(Git Hooks)
若希望在本地 git push 后自动将代码部署到 Web
目录,可在裸仓库中配置 post-receive 钩子: 1
sudo -u git nano /srv/git/my-project.git/hooks/post-receive
1
2
3
4
5
TARGET_DIR="/var/www/my-project"
GIT_DIR="/srv/git/my-project.git"
git --work-tree=$TARGET_DIR --git-dir=$GIT_DIR checkout -f main1
sudo chmod +x /srv/git/my-project.git/hooks/post-receive