Git服务器 – 搭建专属代码仓库,协作无忧🌐

214次阅读

前面咱们学了 Git 分支、合并这些本地操作,但团队协作光有本地仓库可不够~ 就像你写的代码想让同事帮忙 review,总不能把电脑搬给人家吧?🤣

这时候就需要 Git 服务器 啦!它就像一个“代码中转站”,所有人都能把代码推上去、拉下来,不管你在公司、家里还是咖啡店,只要能上网就能协作。本章咱们从协议选择、服务器搭建到第三方托管,一步步成为“代码仓库管理员”!

提示:如果不想自己搭服务器,直接看最后一部分“第三方托管”(比如 GitHub、GitLab),新手也能 5 分钟上手~

⭐ 一、Git 协议详解 – 选择适合你的 ” 数据传输通道 ”
关键字:本地协议、HTTP/HTTPS 协议、SSH 协议、Git 协议、优缺点对比

Git 传输代码需要通过“协议”,就像寄快递选不同的快递公司——有的快、有的安全、有的便宜(免费)。Git 支持 4 种核心协议,咱们一个个说清楚~

1. 本地协议(Local Protocol):最直接的 ” 本地共享 ”

简单说就是把仓库放在本地磁盘或共享文件夹(比如公司内网的 NFS 服务器),其他人通过文件路径访问。

# 克隆本地共享目录的仓库
$ git clone /opt/git/project.git # 直接用路径
# 或显式指定 file:// 协议(效率较低,一般不用)
$ git clone file:///opt/git/project.git
趣味类比📂: 本地协议就像把文件放在 U 盘里传给同事——直接、不用网络,但只能近距离共享,你不在公司就没法用,而且 U 盘丢了(仓库损坏)就麻烦了。

优缺点速览:

  • ✅ 优点:简单到极致,不用配置服务器;利用系统文件权限控制访问
  • ❌ 缺点:只能本地 / 内网访问,远程(比如家里)用不了;共享文件夹速度可能比网络协议慢;无防护,容易误删仓库文件

2. HTTP/HTTPS 协议:最通用的 ” 跨网通道 ”

分为“智能 HTTP(Smart HTTP)”和“dumb HTTP(Dumb HTTP)”,现在基本都用智能版,支持读写、认证,还能通过 80/443 端口(防火墙一般都开放)。

# 克隆 GitHub 仓库(用 HTTPS 协议,最常用)
$ git clone https://github.com/schacon/simplegit.git

核心特点:

  • 🔹 智能 HTTP:支持读写,能自动协商数据传输,像 SSH 一样高效;支持用户名 / 密码认证,不用配置密钥
  • 🔹 dumb HTTP:只读,简单到把仓库放在 Web 服务器(如 Apache)目录下就行,适合公开只读仓库
趣味类比🌐: HTTP 协议就像用浏览器上网——不管你在哪,只要能连网就能访问,输入账号密码就能操作,门槛极低,适合大多数团队。

优缺点速览:

  • ✅ 优点:通用性强,跨网络访问方便;支持加密(HTTPS);认证简单(用户名 / 密码);防火墙友好
  • ❌ 缺点:配置比 SSH 稍复杂;每次推送可能要输密码(可通过凭证缓存解决)

3. SSH 协议:最安全的 ” 专属通道 ”

SSH 是最常用的 Git 服务器协议之一,几乎所有服务器都支持。它通过密钥认证,数据传输全程加密,安全又高效。

# 克隆 SSH 协议的仓库(两种写法)
$ git clone ssh://user@server/project.git
$ git clone user@server:project.git # 简写,更常用
新手必知⚠️: SSH 协议需要先配置“公钥 / 私钥”——把你的公钥放到服务器上,之后访问就不用输密码了,既安全又方便。后面会详细讲配置步骤~
趣味类比🔐: SSH 协议就像你家的智能门锁——只有持有正确“钥匙”(私钥)的人才能进门,别人进不来,而且开门过程加密,不用担心被偷看。

优缺点速览:

  • ✅ 优点:安全(加密 + 密钥认证);高效(数据压缩传输);配置简单(大多数服务器已预装 SSH)
  • ❌ 缺点:不支持匿名访问(必须有服务器账号 / 密钥);新手需要学习密钥配置

4. Git 协议:最快的 ” 匿名通道 ”

Git 自带的专用协议,监听 9418 端口,只支持只读访问,无认证,速度极快(没有加密和认证的开销)。

# 克隆 Git 协议的仓库(一般用于公开项目)
$ git clone git://git.kernel.org/pub/scm/git/git.git
重要提醒❗️: Git 协议没有认证,任何人都能访问,所以只能用于公开仓库!如果开启写权限,相当于把仓库暴露在互联网上,风险极高~

优缺点速览:

  • ✅ 优点:速度最快;适合大量匿名用户访问的公开项目
  • ❌ 缺点:无认证(不安全);无加密;配置复杂(需要单独启动守护进程);9418 端口可能被防火墙拦截
新手选择建议🧠:👉 团队内部协作:优先选SSH 协议(安全、高效)

👉 公开项目 / 跨团队协作:优先选HTTPS 协议(通用、方便)

👉 本地小团队临时共享:用 本地协议(简单)

👉 大型公开项目(如 Linux 内核):用Git 协议(快)+ SSH 协议(写权限)组合

👷 二、搭建 Git 服务器 – 新手也能搞定的步骤
关键字:裸仓库、SSH 配置、Git 守护进程、Smart HTTP、Linux 服务器

咱们以最常用的 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 就是裸仓库,可复制到服务器
趣味类比📦: 裸仓库就像快递仓库——只负责存储包裹(代码提交),不拆开包裹(不 checkout 工作目录),这样才能高效地接收和分发包裹。

2. 配置 SSH 访问(最常用)

SSH 是团队内部协作的首选,配置步骤分“服务器端”和“客户端”。

步骤 1:服务器端配置(管理员操作)

    1. 创建 git 用户(专门用于 Git 操作,避免用 root)
$ sudo adduser git # 创建 git 用户
$ su git # 切换到 git 用户
$ cd ~ # 进入 git 用户的家目录
    1. 创建.ssh 目录,用于存储客户端公钥
$ mkdir .ssh && chmod 700 .ssh # 权限必须是 700(仅所有者可读写执行)
$ touch .ssh/authorized_keys && chmod 600 .ssh/authorized_keys # 权限 600(仅所有者可读写)
    1. 添加客户端公钥到 authorized_keys(关键步骤)

让每个团队成员发送他们的 SSH 公钥(~/.ssh/id_rsa.pub 文件内容),然后追加到服务器的 authorized_keys 文件:

# 假设收到了 john 的公钥,保存为 /tmp/id_rsa.john.pub
$ cat /tmp/id_rsa.john.pub >> ~/.ssh/authorized_keys
# 同理添加其他成员的公钥
    1. 限制 git 用户只能用 Git 命令(禁止登录 shell)

为了安全,不让 git 用户登录服务器 shell,只允许 Git 操作:

# 查看 git-shell 路径
$ 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.”
    1. 上传裸仓库到服务器
# 在本地将裸仓库复制到服务器的 /opt/git 目录
$ 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:客户端配置(开发者操作)

    1. 生成 SSH 密钥(如果没有)
$ ssh-keygen # 一路回车,不需要设置密码(也可以设置)
# 生成后,公钥在~/.ssh/id_rsa.pub,私钥在~/.ssh/id_rsa
    1. 将公钥发送给服务器管理员(如上面步骤)
    2. 克隆服务器仓库,开始协作
# 克隆仓库
$ git clone git@server:/opt/git/my_project.git
# 提交代码并推送
$ cd my_project
$ vim README.md && git commit -am “update README”
$ git push origin master # 直接推送,不用输密码
新手避坑⚠️:1. 服务器上.ssh 目录和 authorized_keys 的权限必须是 700 和 600,否则 SSH 会拒绝访问!

2. 客户端私钥(id_rsa)不能泄露,权限设置为 600(chmod 600 ~/.ssh/id_rsa)

3. 配置 Smart HTTP(支持匿名读 + 认证写)

如果需要对外提供访问(比如跨团队协作),可以配置 Smart HTTP,用 Apache 或 Nginx 作为 Web 服务器。这里以 Apache 为例:

步骤 1:安装 Apache 并启用模块

$ sudo apt-get install apache2 apache2-utils # Ubuntu 安装 Apache
$ a2enmod cgi alias env rewrite # 启用必需模块

步骤 2:配置 Apache 虚拟主机

$ sudo vim /etc/apache2/sites-available/git.conf
# 添加以下内容

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:创建密码文件(添加用户)

# 添加用户 schacon,设置密码(会提示输入密码)
$ htpasswd -c /opt/git/.htpasswd schacon
# 后续添加其他用户,去掉 - c 选项
$ htpasswd /opt/git/.htpasswd john

步骤 4:启动 Apache 并测试

$ sudo a2ensite git.conf # 启用虚拟主机
$ 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
复杂场景应用🌐: 生产环境中建议给 HTTP 配置 SSL(HTTPS),避免密码和代码明文传输。可以通过 Let’s Encrypt 申请免费 SSL 证书,配置后用 https:// 访问。

4. 配置 Git 守护进程(匿名只读访问)

如果需要提供匿名只读访问(比如公开开源项目),可以配置 Git 守护进程:

# 启动 Git 守护进程(–base-path 指定仓库目录)
$ 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
安全提醒❗️: Git 守护进程无认证,只能用于只读访问!不要开启写权限,否则任何人都能推送代码篡改仓库。

🖥️ 三、Web 界面配置 – 让仓库管理更直观
关键字:GitWeb、GitLab、可视化管理、代码浏览

纯命令行管理仓库不够直观?可以配置 Web 界面,支持浏览代码、查看提交历史、管理用户权限等。常用的有 GitWeb(简单)和 GitLab(全功能)。

1. GitWeb:轻量级 Web 界面(简单易用)

Git 自带的 CGI 脚本,配置简单,适合小型团队或个人使用。

配置步骤(Apache 为例):

# 1. 安装 GitWeb(Ubuntu)
$ sudo apt-get install gitweb
# 2. 配置 GitWeb 的仓库目录
$ sudo vim /etc/gitweb.conf
# 添加:$projectroot = “/opt/git”; # 指向你的仓库目录
# 3. 配置 Apache(一般安装后自动配置,无需手动修改)
# 4. 访问 Web 界面:http://server/gitweb

访问后能看到所有仓库,点击进入可浏览代码、查看提交历史、分支情况,界面简洁明了,适合快速查看。

趣味类比📖: GitWeb 就像一本简单的代码“说明书”——能看到代码的结构和修改记录,但功能不多,适合快速查阅。

2. GitLab:全功能 Git 平台(企业级)

GitWeb 功能太简单?GitLab 是更强大的选择,支持用户管理、权限控制、合并请求(MR)、CI/CD 等,相当于“自建 GitHub”。

安装 GitLab(推荐用 Docker,新手友好):

# 1. 安装 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

初始配置:

  1. 访问 http://server(服务器 IP),首次登录会让你修改 root 密码(默认用户名 root)
  2. 创建用户:Admin Area → Users → New User,添加团队成员
  3. 创建项目:点击右上角“+”→ New Project,填写项目名称即可
  4. 克隆项目:项目页面会显示 HTTPS 和 SSH 地址,客户端直接克隆

核心功能(新手必用):

  • 👥 用户 / 组管理:给不同用户分配不同权限(Guest/Reporter/Developer/Owner)
  • 🔀 合并请求(MR):开发者提交代码到分支后,发起 MR,管理员审核后合并到主分支
  • 📝 Issues:跟踪任务、bug,关联代码提交
  • 🔒 仓库可见性:设置私有(仅成员访问)、内部(登录用户访问)、公开(所有人访问)
企业级应用🌐: 大型团队用 GitLab 时,可配置 LDAP 认证(对接公司内部用户系统)、设置 CI/CD 流水线(代码提交后自动构建、测试、部署)、配置钩子(触发外部工具,如通知到企业微信)。

☁️ 四、第三方托管 – 新手首选,5 分钟上手
关键字:GitHub、GitLab、Gitee、托管平台、协作流程

不想自己搭服务器、维护安全补丁?直接用第三方托管平台!它们提供现成的 Git 服务器、Web 界面、协作工具,免费版足够小团队使用。

1. 主流托管平台对比(新手选型)

  • 🌟 GitHub:全球最大的 Git 托管平台,开源项目多,适合个人和开源团队
  • 🌟 GitLab:功能最全(免费版支持私有仓库无上限),适合企业和团队
  • 🌟 Gitee(码云):国内平台,访问速度快,支持中文,适合国内团队

2. GitHub 使用教程(新手入门)

步骤 1:注册账号并创建仓库

  1. 访问 https://github.com,注册账号(邮箱验证)
  2. 点击右上角“+”→ New repository,填写仓库名称(如 my-project),点击 Create repository

步骤 2:本地仓库关联 GitHub 并推送

# 1. 本地初始化仓库(如果没有)
$ 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”流程:

  1. collaborator 点击 GitHub 项目页面的“Fork”,复制一份到自己的仓库
  2. 克隆自己仓库的代码,修改后推送
  3. 在自己仓库页面点击“Pull Request”,向原项目发起合并请求
  4. 原项目管理员审核代码,通过后合并到主分支
趣味类比🤝: Fork + PR 就像“接力赛”——你先把别人的项目“复制”到自己手里(Fork),修改后“递回去”(PR),对方确认没问题后“接过来”(合并),整个过程有序又安全。

3. 常见问题解决(新手必看)

  • ❓ 推送时提示“permission denied”:检查仓库权限,或用 SSH 密钥认证(GitHub → Settings → SSH and GPG keys → 添加公钥)
  • ❓ 国内访问 GitHub 慢:用 Gitee 替代,或配置代理
  • ❓ 忘记密码:在平台登录页面点击“Forgot password”,通过邮箱找回
新手建议💡: 个人学习用 GitHub,国内团队协作用 Gitee,企业团队用 GitLab(自建或用 GitLab.com)。免费版足够满足大部分需求,不用一开始就付费。

🚀 五、实战场景 – 真实团队的 Git 服务器协作流程
关键字:团队协作、分支管理、权限控制、代码审核

结合前面的知识点,模拟一个 10 人小团队的协作流程,用 GitLab 作为托管平台(新手可直接套用):

场景:开发一个电商网站,使用 GitLab 托管代码

  1. 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. 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. 3. 发起合并请求(MR)并审核1. 开发者在 GitLab 页面,从 feature/payment 分支向 develop 分支发起 MR

    2. 管理员 / 技术负责人审核代码,提出修改意见

    3. 开发者根据意见修改代码,推送后 MR 自动更新

    4. 审核通过后,管理员合并 MR 到 develop 分支

  4. 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. 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 分支
流程亮点🌐:1. 保护 master 分支,避免直接推送导致代码混乱

2. 功能开发在 feature 分支,通过 MR 审核后合并,保证代码质量

3. hotfix 分支同时合并到 master 和 develop,避免 bug 重复出现

4. 所有操作都在 GitLab 上留痕,方便追溯和管理

🎯 六、总结 – Git 服务器核心技能图谱

Git 服务器是团队协作的核心,掌握这些知识点就能应对大部分场景:

  • 💡 协议选择:内部协作选 SSH,跨网 / 公开项目选 HTTPS
  • 💡 服务器搭建:新手用第三方托管(GitHub/Gitee/GitLab),进阶自建 GitLab
  • 💡 协作流程:分支隔离(master/develop/feature/hotfix)+ MR 审核
  • 💡 安全要点:SSH 密钥认证、仓库权限控制、保护主分支

要不要我帮你整理一份Git 服务器搭建与协作速查表?包含 SSH 配置、GitLab 常用操作、团队协作流程模板,打印出来就能直接用,帮你快速落地到实际项目中~

正文完
 0