用 git daemon 或 ssh + 基础用户管理即可运行私有 Git 仓库,无需 GitLab/Gitea 等重型服务,除非明确需要 Web 界面、PR、权限分级或 CI 集成。

直接说结论:用 git daemon 或 ssh + 基础用户管理就能跑通私有 Git 仓库,不需要装 GitLab、Gitea 这类重型服务——除非你明确需要 Web 界面、PR、权限分级或 CI 集成。
为什么不用 GitLab/Gitea?先看你的真实需求
很多人一上来就折腾 Docker 跑 GitLab,结果发现只用来 push/pull 几个私有项目,反而被内存占用、备份策略、反向代理、SSL 更新拖慢节奏。真正需要自建服务器的典型场景只有三个:
- 公司内网无外网访问,但开发要共享代码(
ssh最稳) - 想用
git clone git@server:/path/repo.git这种原生协议,不依赖 HTTPS 登录态 - 已有 Linux 服务器闲置,想零成本复用(比如一台旧 NAS 或 VPS)
如果你只是“不想把代码放 GitHub”,但能接受 GitHub 私有库(免费版已支持),那自建反而增加维护负担。
最简方案:纯 SSH 模式(推荐新手)
Git 本身不依赖专用服务端——只要目标机器有 SSH 和 Git,就能当服务器用。核心是让远程用户能通过 SSH 执行 git-receive-pack 和 git-upload-pack。
响应式创新IT服务公司网站模板是一款适合提供web开发、移动应用程序设计、创造性解决方案和UX/用户界面设计等IT技术服务公司宣传网站模板下载。提示:本模板调用到谷歌字体库,可能会出现页面打开比较缓慢。
- 在服务端创建裸仓库:
mkdir -p /home/git/repos/myproject.git && cd /home/git/repos/myproject.git && git init --bare - 确保
/home/git目录属主为git用户,且git用户的 shell 是/usr/bin/git-shell(禁用交互式登录,仅允许 Git 命令) - 客户端克隆:
git clone git@your-server:/home/git/repos/myproject.git - 注意权限:如果 push 报错
fatal: Could not read from remote repository,大概率是git用户对仓库目录没写权限,或 SELinux 拦截(CentOS/RHEL 上执行setsebool -P git_system_enable 1)
进阶选择:git daemon 提供只读 HTTP 访问
适合做公开开源项目的轻量镜像,或内部文档/配置仓库的只读分发。它不认证、不写入,只响应 git:// 协议请求。
- 启动命令:
git daemon --base-path=/home/git/repos --export-all --enable=receive-pack --verbose -
--export-all表示所有子目录下的裸仓库都可被发现;--enable=receive-pack允许 push(默认只读,加这参数才可写) - 客户端用
git clone git://your-server/myproject.git,注意不是http://,也不走 80 端口(默认 9418) - 安全警告:
git daemon默认无认证、无加密,切勿暴露在公网;如需 HTTPS,应配合 Nginx 反代 + basic auth,而非直接启用 TLS
容易被忽略的三个硬伤
自建私有 Git 服务器不是“搭完就完事”,以下三点常被跳过,导致后续协作卡壳:
-
git用户无法 sudo,但某些自动化脚本(如 post-receive 钩子部署)需要操作其他服务(Nginx、systemd),得显式配置sudoers白名单 - 没有垃圾回收机制:长期 push 大文件后,
git gc不会自动运行,仓库体积膨胀,需在post-receive钩子里加git gc --auto - SSH 密钥管理靠手工:多人协作时,别把所有公钥塞进
/home/git/.ssh/authorized_keys——改用AuthorizedKeysCommand调用脚本从数据库或文件动态加载,否则密钥过期难清理
真正的难点不在“怎么搭”,而在“怎么不让它变成下一个没人敢动的遗留系统”。先跑通一个仓库,再逐个补上钩子、监控和密钥轮换,比一上来堆功能更可持续。

















