前面咱们学了 Git 分支、合并这些本地操作,但团队协作光有本地仓库可不够~ 就像你写的代码想让同事帮忙 review,总不能把电脑搬给人家吧?🤣
这时候就需要 Git 服务器 啦!它就像一个“代码中转站”,所有人都能把代码推上去、拉下来,不管你在公司、家里还是咖啡店,只要能上网就能协作。本章咱们从协议选择、服务器搭建到第三方托管,一步步成为“代码仓库管理员”!
提示:如果不想自己搭服务器,直接看最后一部分“第三方托管”(比如 GitHub、GitLab),新手也能 5 分钟上手~
Git 传输代码需要通过“协议”,就像寄快递选不同的快递公司——有的快、有的安全、有的便宜(免费)。Git 支持 4 种核心协议,咱们一个个说清楚~
1. 本地协议(Local Protocol):最直接的 ” 本地共享 ”
简单说就是把仓库放在本地磁盘或共享文件夹(比如公司内网的 NFS 服务器),其他人通过文件路径访问。
$ git clone /opt/git/project.git # 直接用路径
# 或显式指定 file:// 协议(效率较低,一般不用)
$ git clone file:///opt/git/project.git
优缺点速览:
- ✅ 优点:简单到极致,不用配置服务器;利用系统文件权限控制访问
- ❌ 缺点:只能本地 / 内网访问,远程(比如家里)用不了;共享文件夹速度可能比网络协议慢;无防护,容易误删仓库文件
2. HTTP/HTTPS 协议:最通用的 ” 跨网通道 ”
分为“智能 HTTP(Smart HTTP)”和“dumb HTTP(Dumb HTTP)”,现在基本都用智能版,支持读写、认证,还能通过 80/443 端口(防火墙一般都开放)。
$ git clone https://github.com/schacon/simplegit.git
核心特点:
- 🔹 智能 HTTP:支持读写,能自动协商数据传输,像 SSH 一样高效;支持用户名 / 密码认证,不用配置密钥
- 🔹 dumb HTTP:只读,简单到把仓库放在 Web 服务器(如 Apache)目录下就行,适合公开只读仓库
优缺点速览:
- ✅ 优点:通用性强,跨网络访问方便;支持加密(HTTPS);认证简单(用户名 / 密码);防火墙友好
- ❌ 缺点:配置比 SSH 稍复杂;每次推送可能要输密码(可通过凭证缓存解决)
3. SSH 协议:最安全的 ” 专属通道 ”
SSH 是最常用的 Git 服务器协议之一,几乎所有服务器都支持。它通过密钥认证,数据传输全程加密,安全又高效。
$ git clone ssh://user@server/project.git
$ git clone user@server:project.git # 简写,更常用
优缺点速览:
- ✅ 优点:安全(加密 + 密钥认证);高效(数据压缩传输);配置简单(大多数服务器已预装 SSH)
- ❌ 缺点:不支持匿名访问(必须有服务器账号 / 密钥);新手需要学习密钥配置
4. Git 协议:最快的 ” 匿名通道 ”
Git 自带的专用协议,监听 9418 端口,只支持只读访问,无认证,速度极快(没有加密和认证的开销)。
$ git clone git://git.kernel.org/pub/scm/git/git.git
优缺点速览:
- ✅ 优点:速度最快;适合大量匿名用户访问的公开项目
- ❌ 缺点:无认证(不安全);无加密;配置复杂(需要单独启动守护进程);9418 端口可能被防火墙拦截
👉 公开项目 / 跨团队协作:优先选HTTPS 协议(通用、方便)
👉 本地小团队临时共享:用 本地协议(简单)
👉 大型公开项目(如 Linux 内核):用Git 协议(快)+ SSH 协议(写权限)组合
咱们以最常用的 Linux 服务器 为例(Ubuntu/CentOS 都适用),一步步搭建支持 SSH 和 HTTP 协议的 Git 服务器。核心是先创建“裸仓库”(没有工作目录,只存 Git 数据),再配置访问权限。
1. 准备工作:创建裸仓库
Git 服务器上的仓库必须是“裸仓库”(bare repository),因为它只用来存储数据,不用 checkout 代码。裸仓库目录一般以 .git 结尾。
$ mkdir my_project && cd my_project
$ git init # 初始化本地仓库
$ touch README.md && git add . && git commit -m “initial commit”
# 导出为裸仓库(–bare 选项)
$ git clone –bare my_project my_project.git
# 现在 my_project.git 就是裸仓库,可复制到服务器
2. 配置 SSH 访问(最常用)
SSH 是团队内部协作的首选,配置步骤分“服务器端”和“客户端”。
步骤 1:服务器端配置(管理员操作)
-
- 创建 git 用户(专门用于 Git 操作,避免用 root)
$ su git # 切换到 git 用户
$ cd ~ # 进入 git 用户的家目录
-
- 创建.ssh 目录,用于存储客户端公钥
$ touch .ssh/authorized_keys && chmod 600 .ssh/authorized_keys # 权限 600(仅所有者可读写)
-
- 添加客户端公钥到 authorized_keys(关键步骤)
让每个团队成员发送他们的 SSH 公钥(~/.ssh/id_rsa.pub 文件内容),然后追加到服务器的 authorized_keys 文件:
$ cat /tmp/id_rsa.john.pub >> ~/.ssh/authorized_keys
# 同理添加其他成员的公钥
-
- 限制 git 用户只能用 Git 命令(禁止登录 shell)
为了安全,不让 git 用户登录服务器 shell,只允许 Git 操作:
$ which git-shell # 输出可能是 /usr/bin/git-shell
# 将 git 用户的 shell 改为 git-shell
$ sudo chsh git # 输入 /usr/bin/git-shell
# 验证:现在用 ssh 登录会被拒绝,只能用 Git 命令
$ ssh git@server # 会提示 “Interactive git shell is not enabled.”
-
- 上传裸仓库到服务器
$ scp -r my_project.git git@server:/opt/git/
# 服务器上设置仓库权限(可选,让 git 用户有读写权限)
$ ssh git@server
$ cd /opt/git/my_project.git
$ git init –bare –shared # –shared 开启组写权限
步骤 2:客户端配置(开发者操作)
-
- 生成 SSH 密钥(如果没有)
# 生成后,公钥在~/.ssh/id_rsa.pub,私钥在~/.ssh/id_rsa
-
- 将公钥发送给服务器管理员(如上面步骤)
- 克隆服务器仓库,开始协作
$ git clone git@server:/opt/git/my_project.git
# 提交代码并推送
$ cd my_project
$ vim README.md && git commit -am “update README”
$ git push origin master # 直接推送,不用输密码
2. 客户端私钥(id_rsa)不能泄露,权限设置为 600(chmod 600 ~/.ssh/id_rsa)
3. 配置 Smart HTTP(支持匿名读 + 认证写)
如果需要对外提供访问(比如跨团队协作),可以配置 Smart HTTP,用 Apache 或 Nginx 作为 Web 服务器。这里以 Apache 为例:
步骤 1:安装 Apache 并启用模块
$ a2enmod cgi alias env rewrite # 启用必需模块
步骤 2:配置 Apache 虚拟主机
# 添加以下内容
ServerName git.example.com # 你的服务器域名
SetEnv GIT_PROJECT_ROOT /opt/git # 仓库存放目录
SetEnv GIT_HTTP_EXPORT_ALL # 允许所有仓库通过 HTTP 访问
ScriptAlias /git/ /usr/lib/git-core/git-http-backend/ # Git CGI 脚本路径# 配置认证(写操作需要登录)
RewriteEngine On
RewriteCond %{QUERY_STRING} service=git-receive-pack [OR]
RewriteCond %{REQUEST_URI} /git-receive-pack$
RewriteRule ^/git/ – [E=AUTHREQUIRED]
<Files “git-http-backend”>
AuthType Basic
AuthName “Git Access”
AuthUserFile /opt/git/.htpasswd # 密码文件路径
Require valid-user
Order deny,allow
Deny from env=AUTHREQUIRED
Satisfy any
步骤 3:创建密码文件(添加用户)
$ htpasswd -c /opt/git/.htpasswd schacon
# 后续添加其他用户,去掉 - c 选项
$ htpasswd /opt/git/.htpasswd john
步骤 4:启动 Apache 并测试
$ sudo service apache2 restart # 重启 Apache
# 客户端克隆(匿名读,不用密码)
$ git clone http://git.example.com/git/my_project.git
# 客户端推送(需要输入用户名密码)
$ git push http://git.example.com/git/my_project.git master
4. 配置 Git 守护进程(匿名只读访问)
如果需要提供匿名只读访问(比如公开开源项目),可以配置 Git 守护进程:
$ git daemon –reuseaddr –base-path=/opt/git/ /opt/git/
# 让仓库允许被访问:在仓库目录创建 git-daemon-export-ok 文件
$ ssh git@server
$ cd /opt/git/my_project.git
$ touch git-daemon-export-ok
# 客户端克隆(无需认证)
$ git clone git://server/my_project.git
纯命令行管理仓库不够直观?可以配置 Web 界面,支持浏览代码、查看提交历史、管理用户权限等。常用的有 GitWeb(简单)和 GitLab(全功能)。
1. GitWeb:轻量级 Web 界面(简单易用)
Git 自带的 CGI 脚本,配置简单,适合小型团队或个人使用。
配置步骤(Apache 为例):
$ sudo apt-get install gitweb
# 2. 配置 GitWeb 的仓库目录
$ sudo vim /etc/gitweb.conf
# 添加:$projectroot = “/opt/git”; # 指向你的仓库目录
# 3. 配置 Apache(一般安装后自动配置,无需手动修改)
# 4. 访问 Web 界面:http://server/gitweb
访问后能看到所有仓库,点击进入可浏览代码、查看提交历史、分支情况,界面简洁明了,适合快速查看。
2. GitLab:全功能 Git 平台(企业级)
GitWeb 功能太简单?GitLab 是更强大的选择,支持用户管理、权限控制、合并请求(MR)、CI/CD 等,相当于“自建 GitHub”。
安装 GitLab(推荐用 Docker,新手友好):
$ sudo apt-get install docker.io
# 2. 拉取 GitLab 镜像
$ sudo docker pull gitlab/gitlab-ce:latest
# 3. 启动 GitLab 容器
$ sudo docker run -d –name gitlab \
-p 80:80 -p 443:443 -p 22:22 \
-v /srv/gitlab/config:/etc/gitlab \
-v /srv/gitlab/logs:/var/log/gitlab \
-v /srv/gitlab/data:/var/opt/gitlab \
gitlab/gitlab-ce:latest
初始配置:
- 访问 http://server(服务器 IP),首次登录会让你修改 root 密码(默认用户名 root)
- 创建用户:Admin Area → Users → New User,添加团队成员
- 创建项目:点击右上角“+”→ New Project,填写项目名称即可
- 克隆项目:项目页面会显示 HTTPS 和 SSH 地址,客户端直接克隆
核心功能(新手必用):
- 👥 用户 / 组管理:给不同用户分配不同权限(Guest/Reporter/Developer/Owner)
- 🔀 合并请求(MR):开发者提交代码到分支后,发起 MR,管理员审核后合并到主分支
- 📝 Issues:跟踪任务、bug,关联代码提交
- 🔒 仓库可见性:设置私有(仅成员访问)、内部(登录用户访问)、公开(所有人访问)
不想自己搭服务器、维护安全补丁?直接用第三方托管平台!它们提供现成的 Git 服务器、Web 界面、协作工具,免费版足够小团队使用。
1. 主流托管平台对比(新手选型)
- 🌟 GitHub:全球最大的 Git 托管平台,开源项目多,适合个人和开源团队
- 🌟 GitLab:功能最全(免费版支持私有仓库无上限),适合企业和团队
- 🌟 Gitee(码云):国内平台,访问速度快,支持中文,适合国内团队
2. GitHub 使用教程(新手入门)
步骤 1:注册账号并创建仓库
- 访问 https://github.com,注册账号(邮箱验证)
- 点击右上角“+”→ New repository,填写仓库名称(如 my-project),点击 Create repository
步骤 2:本地仓库关联 GitHub 并推送
$ mkdir my-project && cd my-project
$ git init
$ touch README.md && git add . && git commit -m “initial commit”
# 2. 关联 GitHub 仓库(仓库地址在 GitHub 项目页面复制)
$ git remote add origin https://github.com/your-username/my-project.git
# 3. 推送代码到 GitHub(需要输入 GitHub 用户名和密码,或用 SSH 密钥)
$ git push -u origin master
步骤 3:团队协作流程(Fork + Pull Request)
如果是开源项目或跨团队协作,常用“Fork + PR”流程:
- collaborator 点击 GitHub 项目页面的“Fork”,复制一份到自己的仓库
- 克隆自己仓库的代码,修改后推送
- 在自己仓库页面点击“Pull Request”,向原项目发起合并请求
- 原项目管理员审核代码,通过后合并到主分支
3. 常见问题解决(新手必看)
- ❓ 推送时提示“permission denied”:检查仓库权限,或用 SSH 密钥认证(GitHub → Settings → SSH and GPG keys → 添加公钥)
- ❓ 国内访问 GitHub 慢:用 Gitee 替代,或配置代理
- ❓ 忘记密码:在平台登录页面点击“Forgot password”,通过邮箱找回
结合前面的知识点,模拟一个 10 人小团队的协作流程,用 GitLab 作为托管平台(新手可直接套用):
场景:开发一个电商网站,使用 GitLab 托管代码
- 1. 管理员初始化项目
# 1. 管理员在 GitLab 创建项目 ecommerce,设置为私有仓库
# 2. 本地克隆项目,初始化代码结构
$ git clone https://gitlab.com/admin/ecommerce.git
$ cd ecommerce
$ mkdir src docs
$ touch README.md src/index.html
$ git add . && git commit -m “init project structure”
$ git push origin master
# 3. 创建 develop 分支(开发主分支),保护 master 分支(禁止直接推送)
$ git checkout -b develop
$ git push origin develop
# 在 GitLab 项目设置中,将 master 分支设为 ”Protected Branch”,只允许管理员合并 - 2. 开发者加入项目并开发功能
# 1. 开发者接收 GitLab 邀请,加入项目
# 2. 克隆项目,切换到 develop 分支
$ git clone https://gitlab.com/admin/ecommerce.git
$ cd ecommerce
$ git checkout develop
# 3. 创建功能分支(feature/xxx)
$ git checkout -b feature/payment
# 4. 开发支付功能,多次提交
$ vim src/payment.js && git add . && git commit -m “add alipay API”
$ git commit -am “fix payment callback bug”
# 5. 推送功能分支到 GitLab
$ git push origin feature/payment - 3. 发起合并请求(MR)并审核1. 开发者在 GitLab 页面,从 feature/payment 分支向 develop 分支发起 MR
2. 管理员 / 技术负责人审核代码,提出修改意见
3. 开发者根据意见修改代码,推送后 MR 自动更新
4. 审核通过后,管理员合并 MR 到 develop 分支
- 4. 测试与发布
# 1. 合并后,删除功能分支(本地 + 远程)
$ git checkout develop
$ git pull origin develop
$ git branch -d feature/payment
$ git push origin –delete feature/payment
# 2. 测试通过后,从 develop 分支向 master 分支发起 MR
# 3. 管理员审核通过,合并到 master 分支,打标签(版本号)
$ git checkout master
$ git pull origin master
$ git tag -a v1.0 -m “release v1.0”
$ git push origin v1.0 - 5. 紧急修复 bug
# 1. 从 master 分支创建 hotfix 分支
$ git checkout master
$ git checkout -b hotfix/login-error
# 2. 修复登录 bug,推送分支
$ vim src/login.js && git commit -am “fix login failed bug”
$ git push origin hotfix/login-error
# 3. 发起 MR 到 master 和 develop 分支,合并后删除 hotfix 分支
2. 功能开发在 feature 分支,通过 MR 审核后合并,保证代码质量
3. hotfix 分支同时合并到 master 和 develop,避免 bug 重复出现
4. 所有操作都在 GitLab 上留痕,方便追溯和管理
Git 服务器是团队协作的核心,掌握这些知识点就能应对大部分场景:
- 💡 协议选择:内部协作选 SSH,跨网 / 公开项目选 HTTPS
- 💡 服务器搭建:新手用第三方托管(GitHub/Gitee/GitLab),进阶自建 GitLab
- 💡 协作流程:分支隔离(master/develop/feature/hotfix)+ MR 审核
- 💡 安全要点:SSH 密钥认证、仓库权限控制、保护主分支
要不要我帮你整理一份Git 服务器搭建与协作速查表?包含 SSH 配置、GitLab 常用操作、团队协作流程模板,打印出来就能直接用,帮你快速落地到实际项目中~