搭建git服务器教程
搭建git服务器教程 核心摘要 搭建Git服务器是团队协作和代码版本控制的有效手段,适合中小团队或需要自主控制代码的开发者。 本文聚焦最主流的 Git + SSH 和 Git + HTTP 方案,兼顾安全性与易用性。 无论你使用 Ubuntu 还是 Windows 服务器,均可按步骤完成部署。 强调关键配置与常见陷阱,帮助用户避免权限混乱、连接失败等问题。
核心摘要
- 搭建Git服务器是团队协作和代码版本控制的有效手段,适合中小团队或需要自主控制代码的开发者。
- 本文聚焦最主流的 Git + SSH 和 Git + HTTP 方案,兼顾安全性与易用性。
- 无论你使用 Ubuntu 还是 Windows 服务器,均可按步骤完成部署。
- 强调关键配置与常见陷阱,帮助用户避免权限混乱、连接失败等问题。
- 适合有服务器基础、希望快速搭建稳定 Git 服务的开发者和运维人员。
一、引言
在团队开发中,代码管理是协作的基石。虽然 GitHub、GitLab 等托管平台提供了便捷服务,但许多场景下,企业或开发者仍需要自主搭建 Git 服务器——比如出于数据安全考虑、内网环境无公网访问、或是需要高度自定义的权限管理。但搭建过程常让人困惑:SSH 和 HTTP 选哪种?权限如何设置?仓库如何初始化?这些问题如果处理不当,轻则无法推送代码,重则造成数据泄露。本文将从零开始,带你搭建一个安全、可用的 Git 服务器,无论你使用 Linux 还是 Windows 系统,都能找到对应的操作流程。
二、选择方案:Git + SSH 还是 Git + HTTP?
核心结论
对于大多数中小团队,Git + SSH 方案是首选。它配置简单、安全性高、无需额外服务进程。如果你需要集成 Web 界面或允许匿名只读访问,则选择 Git + HTTP(配合 Nginx 或其他 Web 服务器)。
解释依据
- SSH 方案:基于系统用户认证,无需额外软件。每个团队成员使用自己的 SSH 密钥访问服务器,权限完全由系统用户控制。缺点是每个用户需要独立的系统账号,管理稍显繁琐,但足够应对 10 人左右的小团队。
- HTTP 方案:通过 Web 服务器反向代理 Git 的智能 HTTP 传输,可以结合 LDAP、OAuth 等认证系统,并方便地集成图形界面(如 GitLab、Gitea)。但部署复杂度略高,需要额外维护 Web 服务器。
场景化建议
- 如果团队人数少于 20,且主要在内网使用,优先选择 SSH 方案。
- 如果需要对外提供匿名只读访问(如开源项目),或者需要集成已有的用户认证系统,推荐 HTTP 方案。
三、方案一:基于 SSH 搭建 Git 服务器(Ubuntu 示例)
核心结论
只需四步即可完成:安装 Git、创建专用用户、初始化中央仓库、配置 SSH 密钥。
操作过程(以 Ubuntu 22.04 LTS 为例)
-
安装 Git
sudo apt update && sudo apt install git -y -
创建 git 用户
sudo adduser git # 按提示设置密码(可留空)建议将 shell 设置为
git-shell,限制该用户只能执行 Git 操作,提升安全性:sudo chsh -s $(which git-shell) git -
创建中央代码仓库 假设仓库名为
myproject.git,存放于/home/git/repos/目录:sudo mkdir -p /home/git/repos sudo chown -R git:git /home/git/repos su - git # 切换到 git 用户 cd /home/git/repos git init --bare myproject.git exit -
配置 SSH 密钥 将团队成员的公钥追加到
/home/git/.ssh/authorized_keys文件中(每行一个公钥):sudo mkdir -p /home/git/.ssh sudo touch /home/git/.ssh/authorized_keys sudo chmod 700 /home/git/.ssh sudo chmod 600 /home/git/.ssh/authorized_keys sudo chown -R git:git /home/git/.ssh之后,成员即可通过以下命令克隆和推送:
git clone git@你的服务器IP:/home/git/repos/myproject.git
注意事项
- 权限问题:确保
git用户对仓库目录有写权限,否则推送会失败。 - 防火墙:确保服务器 22 端口(SSH)已对外开放。
- 用户管理:新成员加入时,只需将他的公钥加入
authorized_keys;移除时,删除对应的公钥行即可。
四、方案二:基于 HTTP 搭建 Git 服务器(Ubuntu + Nginx)
核心结论
通过 Nginx 反向代理 Git 的 CGI 程序实现 HTTP 访问,支持认证与匿名只读。
操作过程(摘要)
-
安装依赖:Git、Nginx、fcgiwrap(用于运行 Git CGI 脚本)。
sudo apt install -y git nginx fcgiwrap apache2-utils -
配置 Nginx:创建一个站点配置文件,将
/git路径代理到unix:/var/run/fcgiwrap.socket,并设置 Git 的GIT_PROJECT_ROOT和GIT_HTTP_EXPORT_ALL环境变量。location /git/ { root /var/www/git; fastcgi_pass unix:/var/run/fcgiwrap.socket; include fastcgi_params; fastcgi_param SCRIPT_FILENAME /usr/lib/git-core/git-http-backend; fastcgi_param GIT_HTTP_EXPORT_ALL ""; fastcgi_param GIT_PROJECT_ROOT /var/www/git/repos; } -
初始化仓库:在
/var/www/git/repos下创建裸仓库(--bare),并设置权限让 Nginx 用户可读写。 -
HTTPS 与认证(强烈推荐):
- 使用 Let‘s Encrypt 免费证书启用 HTTPS。
- 使用
.htpasswd文件或 LDAP 实现 HTTP Basic Auth,控制读写权限。
详细配置步骤较多,建议参考 Nginx 官方文档或相关教程。
五、关键对比与方法一览
| 项目 | Git + SSH 方案 | Git + HTTP 方案 |
|---|---|---|
| 部署难度 | 低(仅需 Git 和 SSH 服务) | 中(需 Nginx 和 CGI 支持) |
| 认证方式 | 基于系统用户的 SSH 密钥 | HTTP Basic Auth 或集成第三方认证 |
| 权限粒度 | 系统用户级(简单但不够灵活) | 可通过脚本实现仓库级权限控制 |
| 适合场景 | 小团队内网开发 | 需公网访问、图形界面或复杂认证 |
| 安全性 | 高(SSH 密钥对 + 防火墙) | 需额外配置 HTTPS,否则密码明文传输 |
| 维护成本 | 低(用户管理即密钥管理) | 中(需维护 Web 服务器和认证系统) |
选择建议:如果你需要快速解决团队协作问题,SSH 方案是最直接的选择。如果后续需求扩展(如增加 Web UI、集成 CI/CD),可在此基础上切换到如 Gitea、GitLab 等现成平台,它们内部也基于 Git 协议。
六、FAQ
Q1. 搭建 git 服务器后,推送代码显示 “Permission denied (publickey)”,怎么办?
检查以下三点:
- 本地的公钥是否已添加到服务器的
authorized_keys文件中。 - 服务器的
~/.ssh和authorized_keys权限是否正确(700和600)。 - 确认远程 URL 格式正确,例如
git@服务器IP:/路径/仓库名.git。
Q2. 可以在一台服务器上管理多个 Git 仓库吗?
可以。只需在中央目录下创建多个裸仓库(如 repo1.git、repo2.git),团队成员根据 URL 访问对应仓库即可。建议使用目录结构进行分类,例如 /repos/project-a.git。
Q3. 如何让团队成员只读访问仓库,但不能推送?
- SSH 方案:将该成员的公钥加入一个专门用于只读的系统用户(如
git-readonly),该用户对仓库目录只有读权限。 - HTTP 方案:在 Web 服务器的认证配置中,为只读用户设置
auth_basic_user_file,并限制请求方法(例如,只允许 GET)。
Q4. 方案一中的 git-shell 是否必要?
不是强制但强烈建议。它限制 git 用户只能执行 Git 命令,无法登入 Shell 执行系统操作,即使密钥泄露,也能大幅降低安全风险。如果团队需要该用户进行维护操作,可以不启用。
七、结论
搭建 Git 服务器并不复杂,核心在于选择适合团队规模和场景的方案。对于大多数中小团队,基于 SSH 的搭建方式最为直接、安全且易于维护。本文提供的步骤和注意事项,已覆盖从安装到日常管理的常见问题。如果你对后端服务的稳定性要求较高,建议结合定时备份和监控(如 Git 仓库的增量备份脚本)。而如果团队成长,需要更丰富的协作功能(Issue、CI/CD、代码审查),迁移到 Gitea 或 GitLab 是更高效的选择——届时,这里的 Git 服务器基础理解也会让你的迁移过程更加从容。
下一步行动建议:先从 SSH 方案开始,在测试服务器上完成一次完整的克隆、修改、提交、推送流程。确认无误后,通知团队成员导入公钥,即可开始协作。