前言:Git 仓库的 SSH 传输
熟悉 Git 的同学可能知道,Git 默认支持两种传输协议:SSH 和 HTTP/HTTPS。
服务器一般都自带 SSH,这意味着,我们可以什么都不安装,只通过 SSH 就把仓库推到远程服务器。
所以,一条命令就够了。我们只要在远程服务器上,建立同名的 Git 仓库,服务器就搭建好了。
$ git init --bare [仓库名].git
上面命令中,各个部分的含义如下。
(1)git init:初始化一个 Git 仓库。
(2)--bare:表示新仓库不需要工作目录,只建立 Git 数据目录。
(3)[仓库名].git:指定仓库名,比如仓库名是example,那么就要建立一个叫做example.git的 Git 数据目录。
执行这条命令以后,一个最简易的 Git 服务器就诞生了。后面,我们就可以通过 SSH 连接,把本地代码推送到这个远程 Git 仓库了。
核心原理
利用 Linux 服务器自带的 SSH 服务,通过在服务器上创建一个专门用户(如 git),并将客户端用户的 SSH 公钥添加到该用户的 authorized_keys 文件中,从而实现安全的免密码认证和代码推送。
准备工作
- 一台虚拟机:安装好任意 Linux 发行版(如 Ubuntu, CentOS, Debian),并确保网络通畅。
- 本地电脑:准备好你的 SSH 密钥对(
id_rsa和id_rsa.pub)。
搭建步骤(在虚拟机上操作)
第 1 步:安装 Git
sudo yum install -y git
确认安装成功:
git --version
第 2 步:创建专用的 Git 用户
为了安全起见,我们不直接使用 root,而是创建一个专门的 git 用户:
# 1. 创建 git 用户
sudo adduser git
# 按照提示为 git 用户设置一个密码(后续可禁用密码登录)
sudo passwd git
# 2. 切换到 git 用户
sudo -iu git
# 3. 创建 ~/.ssh 目录并设置严格权限
mkdir -p ~/.ssh
chmod 700 ~/.ssh
touch ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
第 3 步:配置 SSH 密钥认证
将所有需要访问仓库的开发者的公钥,添加到 git 用户的 authorized_keys 文件中。
在客户端(开发者机器)上生成 SSH 密钥对:
ssh-keygen -t rsa -b 4096 -C "you@example.com"
把生成的公钥追加到服务器的 git 用户下:
cat ~/.ssh/id_rsa.pub | ssh git@<服务器IP> "cat >> ~/.ssh/authorized_keys"
- 注意:用
>>追加,而不是>覆盖。每个公钥占一行。
第 4 步:初始化一个裸仓库(Git Server 的核心)
# 在 git 用户的家目录或其他目录下创建
git init --bare /home/git/example.git
--bare参数是关键!它创建一个没有工作目录、只包含版本控制数据(在.git目录中)的仓库,专门用于共享。
客户端操作(在你的本地电脑上)
第 5 步:克隆远程仓库并开始使用
现在,任何其公钥已被添加到 authorized_keys 的用户,都可以克隆和推送代码了。
# 克隆仓库
git clone git@your_vm_ip:/home/git/example.git
# 进入仓库目录,进行常规的 Git 操作(add, commit)
cd example
echo "# My Project" > README.md
git add .
git commit -m "Initial commit"
# 推送到远程服务器
git push origin main
如果一切顺利,说明服务器搭建完成。
命令解释:
git@your_vm_ip: 使用git用户登录你的虚拟机。:/home/git/example.git: 服务器上裸仓库的绝对路径。
SELinux 常见问题
一个坑,如果是用 root 用户创建 authorized_keys。
在 CentOS 默认开启 SELinux 的情况下,~/.ssh/authorized_keys 文件可能会因为安全上下文不对而导致 公钥认证失败。
查看上下文:
ls -Z /home/git/.ssh/authorized_keys
如果显示 home_root_t 而不是 ssh_home_t,说明 SELinux 阻止了 SSH 访问。
解决办法:
sudo restorecon -Rv /home/git/.ssh
执行后会修正为正确的 ssh_home_t 类型,从而允许公钥登录。
高级配置与安全加固(可选但强烈推荐)
-
禁用 git 用户的 Shell 登录(增强安全)
通过修改/etc/passwd,将 git 用户的登录 shell 改为git-shell(一个只允许 Git 操作的受限 shell)。# 在服务器上使用 root 或 sudo 执行 sudo usermod -s /usr/bin/git-shell git这样,用户无法通过
ssh git@your_vm_ip获得一个普通的 shell,但依然可以执行git fetch,git push等操作。 -
在服务器上禁用密码登录(强制使用密钥认证)
编辑 SSH 服务器配置:sudo vim /etc/ssh/sshd_config找到并修改:
PasswordAuthentication no PubkeyAuthentication yes重启 SSH 服务生效:
sudo systemctl restart sshd
流程总结
- 安装 Git
- 创建
git用户 - 配置 SSH 公钥登录
- 创建裸仓库
- 客户端连接并推送代码
- 解决 SELinux 的授权问题
最终验证
在本地机器上执行:
ssh -T git@your_vm_ip
如果配置正确,你会看到一条类似 “You’ve successfully authenticated, but GitShell does not provide interactive shell access.” 的成功消息,并且无法执行其他 Linux 命令。这证明你的 Git 服务器已经成功搭建并安全配置!
快速搭建私有Git服务器
1307

被折叠的 条评论
为什么被折叠?



