在自己的服务器上搭建Git,本质上就是安装Git软件、创建一个裸仓库,并通过SSH协议让客户端连接,个人使用推荐“Linux服务器+Git裸仓库+SSH”方案,团队协作则推荐部署Gitea或GitLab,成本低且可控性强。
搭建前先想清楚:你的服务器适合哪种Git方案
很多朋友一上来就搜“怎么在自己的服务器上搭建一个git”,结果搜出一堆教程,有讲GitLab的,有讲Gitea的,还有直接敲git init --bare的,看完更懵了,其实选哪种方案,完全取决于你的使用场景和服务器配置。
- 个人项目备份或小团队(5人以内)协作:直接装Git,建裸仓库,走SSH协议,这是最轻量、最省资源的方案,512MB内存的便宜云服务器就能跑得动。
- 团队协作需要代码审查、Issue管理:部署Gitea,它是用Go写的,资源占用极小,1核1G的服务器带起来毫无压力,还自带Web界面和权限管理。
- 中大型团队,需要CI/CD流水线深度集成:上GitLab,功能全但吃配置,官方推荐至少4核8G内存,云服务器成本会明显上去。
这里顺便回应一个高频疑问:个人服务器搭建git仓库选哪种方案更省心? 如果你不想折腾,就选Gitea;如果你想彻底弄懂Git原理,就用裸仓库方案,两者不冲突,你完全可以在裸仓库的基础上再装个Gitea做Web界面。
最硬核的裸仓库搭建(Linux + SSH)
这个方案适合有Linux基础、喜欢掌控一切的朋友,整个过程大概三步:装Git、建裸仓库、配置SSH公钥。
第一步:服务器端安装Git并创建专用用户
先登录你的服务器(以Ubuntu/Debian为例),执行:
sudo apt update sudo apt install git -y
出于安全考虑,不建议用root账号直接跑Git操作,创建一个专用用户,比如叫git:
sudo adduser --disabled-password git
--disabled-password意思是这个用户不能通过密码登录,只能用SSH密钥,安全性更好。
第二步:初始化裸仓库
切到git用户,创建一个存放仓库的目录,然后初始化裸仓库:
sudo su - git mkdir -p ~/repos cd ~/repos git init --bare my-project.git
注意,裸仓库(
--bare)没有工作目录,它只保存版本历史,是专门给服务器端用的,你不可能在服务器上直接看到文件内容,只能通过git clone拉下来。
第三步:配置SSH公钥登录
在你的本地电脑上生成密钥(如果还没有的话):
ssh-keygen -t ed25519 -C "your_email@example.com"
然后把公钥加到服务器的authorized_keys里:
cat ~/.ssh/id_ed25519.pub | ssh git@your_server_ip "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
最后在本地测试克隆:
git clone git@your_server_ip:repos/my-project.git
看到Cloning into 'my-project'...就说明成功了,整个git服务器搭建教程的核心就这三步,剩下的就是日常add、commit、push操作。
进阶操作:用webhook实现自动部署
很多朋友搭好Git后,下一个需求就是“我push代码后,服务器上网站怎么自动更新”,这就涉及服务器搭建git webhook实现自动部署的玩法。
原理很简单:在服务器上写一个接收HTTP请求的脚本,当Git服务器收到push事件时,通过webhook通知这个脚本,脚本再执行git pull或git checkout来更新网站文件。
大致步骤如下:
- 在服务器上创建网站目录,并克隆一份代码过去(非裸仓库)。
- 写一个Shell脚本,内容大致是
cd /var/www/my-site && git pull origin main。 - 用Node.js或Python写一个极简的HTTP服务,监听特定端口,收到请求后执行上面的脚本。
- 在Gitea或GitHub仓库设置里添加webhook地址,指向你的服务器IP和端口。
这个方案比用rsync定时同步更及时,代码一推送,网站秒级更新。
偷懒但强大的Gitea部署
如果你觉得裸仓库太“原始”,不想记SSH配置,也不想用命令行管理用户权限,Gitea绝对是你想要的,业内专家指出,Gitea是目前轻量级Git服务里社区最活跃的项目之一,支持一键安装。
为什么中小团队普遍选择Gitea
Gitea的吸引力在于它把Git、用户管理、Issue、Pull Request、Wiki都打包进了一个不到100MB的二进制文件里,部署方式极其简单:
wget -O gitea https://dl.gitea.com/gitea/1.21.0/gitea-1.21.0-linux-amd64 chmod +x gitea ./gitea web
然后浏览器访问http://your_server_ip:3000,跟着引导填数据库(SQLite就够)、站点名称、管理员账号,搞定。
用Docker Compose部署更省心
不想手动管理二进制文件?用Docker Compose是很多人的选择,写一个docker-compose.yml:
version: "3"
services:
gitea:
image: gitea/gitea:latest
container_name: gitea
environment:
- USER_UID=1000
- USER_GID=1000
restart: always
volumes:
- ./gitea:/data
- /etc/timezone:/etc/timezone:ro
ports:
- "3000:3000"
- "2222:22"
执行docker-compose up -d,Gitea就起来了,这里把服务器的22端口映射到容器的22端口,这样客户端就能直接用git@your_server_ip:owner/repo.git这种格式克隆,不需要带端口号。
新手搭建git服务器用什么系统更合适? 如果你用的是宝塔面板(BT Panel),Gitea甚至支持在面板的软件商店里直接一键部署,连Docker命令都不用敲,国内云服务器厂商的镜像市场里也常有预装Gitea的镜像,买完就能用。
权限管理与安全加固:别让服务器裸奔
很多教程搭完Git就结束了,但真实场景中,权限管理才是让你省心的关键,下面这些配置值得你花几分钟做。
用Git用户的SSH密钥限制命令
默认情况下,git用户登录服务器后是可以执行任意命令的,你可以在~/.ssh/authorized_keys前面加一段限制:
command="/usr/bin/git-shell -c "$SSH_ORIGINAL_COMMAND"",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ssh-ed25519 AAAA...
这样用户只能执行Git相关操作,无法通过SSH登录Shell,这是Git官方推荐的做法,安全性大幅提升。
分支保护规则
如果用了Gitea或GitLab,在仓库设置里开启分支保护,禁止直接push到main或master分支,要求必须通过Pull Request合并,多人协作时,这一步能避免很多“手滑事故”。
定期备份
你的代码是无价的,服务器宕机或硬盘损坏是现实存在的风险,建议用
git bundle做全量备份:
git bundle create my-project.bundle --all
然后配合cron定时任务,每天凌晨把bundle文件同步到对象存储或另一台机器,行业共识认为,异地备份是数据安全的最低保障。
常见问题排查:搭好后连不上怎么办
搭建过程中,相当一部分问题出在SSH连接和权限上。
排查思路
Permission denied (publickey):先检查本地~/.ssh/id_ed25519.pub是否已加到服务器的authorized_keys里,再检查服务器~/.ssh目录权限是否为700,authorized_keys权限是否为600。Repository not found:检查仓库路径是否写对,裸仓库的路径是相对于git用户主目录的,比如git@server:repos/my-project.git。- clone时卡住不动:大概率是服务器防火墙没放行22端口,或者云服务商的安全组规则没加,去云控制台检查入站规则。
连接不上的终极排查命令
ssh -v git@your_server_ip
加-v参数能看到详细的连接日志,卡在哪一步一目了然,这是所有排查手段里最直接有效的。
常见问题解答
问:个人服务器搭建git仓库和用Gitea有什么区别?
裸仓库方案只提供Git存储,没有Web界面、没有用户管理、没有Pull Request,Gitea是完整的Git服务,自带Web界面、用户系统、Issue跟踪,个人用裸仓库够用,多人协作强烈建议Gitea,能省下大量沟通成本。
问:服务器搭建git后怎么给同事开账号?
裸仓库方案下,把同事的公钥追加到服务器的~/.ssh/authorized_keys文件里即可,Gitea方案更简单,管理员在后台创建用户,然后把用户加入仓库的协作者列表就行,后者更适合频繁增减成员的情况。
问:国内云服务器搭建git仓库需要注意什么?
需要留意云服务商的安全组规则,默认情况下22端口可能未对外开放,国内服务器访问GitHub等境外服务不稳定,建议把镜像源或依赖包源换成国内源,如果团队都在国内,服务器选国内地域延迟会低很多。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/601293.html




