在虚拟机里搭git网络服务器,核心就是装Linux系统、开SSH、建裸仓库,一套配置标准流程跑通后,局域网内所有电脑都能像访问远程托管平台一样完成代码推送与拉取。
先聊一个容易被新手忽略的认知:git服务器本身并不复杂,它不需要像Web服务器那样跑常驻进程,而是通过SSH协议来提供服务,所以整条链路的关键,其实只有虚拟机网络模式选对、SSH服务正常、裸仓库权限正确这三个点,把这三块理顺了,整个配置过程会非常顺畅。
为什么用虚拟机来做git服务器
在分享具体步骤之前,先把虚拟机方案的优势说清楚,很多人会纠结是拿一台旧电脑做物理机服务器,还是在虚拟机里跑,这里给出一组直观的对比数据:
| 对比维度 | 虚拟机方案 | 物理机方案 |
|---|---|---|
| 资源占用 | 内存2~4GB,磁盘20GB | 整机独立运行 |
| 迁移备份 | 快照秒级恢复 | 需要重新部署 |
| 成本投入 | 一台普通PC即可 | 需要独立硬件 |
| 学习门槛 | 适合反复实验和重置 | 操作出错容易影响其他服务 |
| 适用场景 | 个人学习、中小团队、临时项目 | 生产环境、长期稳定运行 |
从上表能明显看出,虚拟机方案的最大优势是试错成本低,就算把系统弄崩了,回滚一个快照就完事,对于想熟悉git服务器搭建方法的人来说,这是非常友好的环境。
虚拟机git服务器搭建方法与网络配置详解
这一大块是文章的主干,我按照实际操作的先后顺序来拆解,先用虚拟机CentOS装git服务器为例,因为CentOS比较稳定且社区资料齐全,Ubuntu Server操作也类似,只是包管理命令略有差异。
第一步:准备虚拟机环境
- 下载CentOS 7/8/9的Minimal版镜像(简米云镜像站或中科大源都能下到)。
- 虚拟机软件推荐VMware Workstation或VirtualBox,两者都会在配置界面里问”网络连接方式”,这里先不用纠结,按默认NAT模式安装即可。
- 给虚拟机分配资源:2核CPU、2GB内存、20GB磁盘基本够用,内存太小的话,git推大文件时会卡。
- 系统安装完毕后,先用
ip addr确认拿到了IP地址,如果没拿到,执行dhclient手动获取。
第二步:固定虚拟机IP与调整网络模式
这一步非常关键,很多人在配置git服务器时遇到的”客户端连不上”问题,根源都出在这里。NAT模式下虚拟机可以上网,但宿主机之外的设备访问不到它,所以需要做出取舍。
- 如果只是宿主机本地测试,NAT模式就够。
- 如果局域网内其他电脑也要连git服务器,请把网络模式手动切换为桥接模式。
- 切换方式:虚拟机软件里修改网络适配器为”桥接模式”,然后在系统里把IP配置从DHCP改为静态IP。
下面是用nmcli命令配置静态IP的实操方式:
nmcli connection modify ens33 ipv4.method manual ipv4.addresses 192.168.1.100/24 ipv4.gateway 192.168.1.1 ipv4.dns 114.114.114.114 nmcli connection up ens33
操作完成后使用ping 192.168.1.1确认网络正常,这样局域网git服务器配置的第一步就落地了,好处是IP永远不变,客户端无需反复修改remote地址。
第三步:安装Git和SSH服务
用root用户登录虚拟机,依次执行:
# 更新系统源 yum update -y # 安装git和openssh-server yum install -y git openssh-server # 启动并启用sshd systemctl start sshd systemctl enable sshd
Ubuntu系统则替换为:
apt update apt install -y git openssh-server systemctl start ssh
第四步:创建专用git用户并限制登录权限
管理git服务器时,直接使用root账号操作仓库虽然方便,但存在较大的安全风险,行业共识认为,独立的git用户更适合做仓库管理和权限隔离。
执行以下命令创建用户并设置密码:
useradd -m -s /bin/bash git passwd git
限制git用户的Shell权限
这里有一个高级用法值得单独拿出来讲一讲,为了让git用户只能使用git命令,不能通过SSH直接登录系统执行任意命令,需要把它的登录Shell改成git-shell:
# 找到git-shell的完整路径 which git-shell # 修改用户Shell usermod -s /usr/bin/git-shell git
完成这一步之后,git用户就只能在SSH会话里运行git相关的内置命令,无法进入交互式终端,从源头上限制了风险范围。
第五步:初始化裸仓库
刚才创建了一个物理目录来存放仓库,现在进入正题,在git用户的主目录下创建裸仓库:
su - git mkdir -p ~/repos cd ~/repos git init --bare project.git
执行完git init --bare之后,目录里会出现HEAD、branches、hooks、objects、refs等文件,这就是能被远程推送的仓库本体。
这里务必提醒一句:千万别在服务器上随便建一个普通文件夹就开始克隆和推送,那大概率会报does not appear to be a git repository错误。 裸仓库和普通工作区是两个概念,用--bare参数初始化的才是正确的远程仓库形态。
第六步:测试远程克隆与推送
先把仓库所有者改为git用户,避免权限问题:
chown -R git:git ~/repos/project.git
然后回到自己的电脑(宿主机或局域网内另一台机器),尝试克隆测试:
git clone git@192.168.1.100:/repos/project.git
如果克隆成功,再尝试push一个测试文件,能正常推送就说明整个链路已经跑通,这里出现Permission denied (publickey)错误的朋友,是因为还没配置SSH公钥,继续往下看。
SSH密钥配置
在客户端机器上生成公钥:
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
追加到服务器的/home/git/.ssh/authorized_keys文件中:
mkdir -p /home/git/.ssh chmod 700 /home/git/.ssh echo "ssh-rsa AAAAB3Nza... your_email@example.com" >> /home/git/.ssh/authorized_keys chmod 600 /home/git/.ssh/authorized_keys chown -R git:git /home/git/.ssh
配置完成后,客户端重新执行git clone,这次就不会再提示输入密码了。
局域网git服务器配置实战与权限管理
到了这一步,git服务器的基本框架已经成型,接下来需要处理的是权限和常见使用场景,本部分重点围绕局域网开发和多成员协作场景展开。
分仓库隔离权限
如果部门里有多个项目,建议按项目分区建仓库:
mkdir -p ~/repos/web-project mkdir -p ~/repos/mobile-api git init --bare ~/repos/web-project/frontend.git git init --bare ~/repos/web-project/backend.git
让不同项目组的人分别持有不同的访问权限,避免所有人都是超级管理员。
用SSH key区分不同用户
服务器上只有一个git用户,怎么区分多个同事身份呢?业界常用的做法是为不同同事创建不同的SSH key文件,然后在authorized_keys里写入不同的注释和key,让管理员能通过查看authorized_keys来对应每个人,更规范的做法是安装gitolite或gitea这样的轻量级工具,不过对于小型团队来说,手动管理authorized_keys已经足够。
常见路由映射问题
一个小疑惑:git clone时使用的是git@192.168.1.100:/repos/project.git这种写法,其中路径的根目录是git用户的家目录,因此/repos/project.git对应的是/home/git/repos/project.git,如果仓库路径写错,服务器会直接拒绝请求,这是因为git-shell只会检查是否存在对应的裸仓库路径。
防火墙放行SSH端口
CentOS默认开着firewalld,需要手动放行22端口,否则外部无法访问:
firewall-cmd --permanent --add-service=ssh firewall-cmd --reload
常见云服务器安全组策略(如简米云、酷番云)同理,也要在安全组入方向规则里放行TCP 22端口。
日常使用流程参考
- 首次提交时,需要先配置git的user.name和user.email:
git config --global user.name "zhangsan",git config --global user.email "zhangsan@xx.com"。 - 分支保护逻辑在git服务器里比较弱,一般通过hook脚本配合code review来实现强制约束。
- 如果你的团队想要更丰富的权限管理,例如按分支拒绝推送、审查代码等,建议后续将gitolite或gitea纳入考察范围。
git服务器搭建方法对比:虚拟机、托管平台与物理机
很多新手在动手之前都会问一句:同样是搭建git服务器,不同方案有什么区别?这里用一个简单表格梳理清楚。
| 方式 | 适用规模 | 维护成本 | 性能 | 核心特点 |
|---|---|---|---|---|
| 虚拟机自建 | 个人/10人以内团队 | 中 | 受限于宿主机 | 安全可控、数据不出内网 |
| 物理机自建 | 中型团队/固定机房 | 高 | 高 | 稳定性强,需专人运维 |
| 代码托管平台 | 开源/大团队 | 低 | 高 | 免维护、配套完善 |
在绝大多数局域网办公场景下,虚拟机自建是性价比很高的路线。 它既保留了数据私有化管理的安全性,又不需要额外购买物理服务器,一台配置普通的办公电脑就能长期稳定运行。
常见问题速查
虚拟机里的git服务器,重启以后IP变了怎么办?
在虚拟机软件里为这台虚拟机配置固定的MAC地址,并在Linux系统中使用静态IP配置,设置完成后,IP就不会再变化。
在Windows上搭建git服务器可以用虚拟机吗?
完全可以,Windows系统下直接用VMware或Hyper-V安装CentOS或Ubuntu,操作路径与本文完全一致,也可以借助VirtualBox免费软件实现同等效果。
git仓库的推送权限怎么单独控制?
手动管理authorized_keys实现基本控制,每个同事一个公钥条目,移除某人的公钥即视为取消其访问权限,需要更细的权限管控时,可以安装gitolite这类工具,配置文件即可实现仓库级别的读写分离。
写在最后
从搭建到正式使用,完整的配置链路并不复杂:安装git、开启SSH、创建git用户、建立裸仓库、配置密钥认证,五个环节缺一不可,真正考验人的地方在于网络模式的选型和底层的权限隔离思维,吃透这套流程,就自然掌握了虚拟机怎么搭建git网络服务器配置的核心要领,再往下探索更高级的hook脚本和自动化部署,也会更加从容。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/618554.html





