这一篇在干嘛?
前面几篇你一直在用 GitHub 当远程。这一篇掀开服务端的盖子:Git 用什么协议传输、服务器上放的是什么形态的仓库、自己怎么搭一个最小远端,最后给托管平台选型一个决策依据。对应《Pro Git》第 4 章。
四种传输协议
| 协议 | 形式 | 优点 | 缺点 | 适用 |
|---|---|---|---|---|
| 本地协议 | git clone /path/to/repo | 简单、共享文件系统即可 | 远程协作基本没用 | 同机/局域网 |
| HTTP(S) | https://github.com/... | 通用、穿防火墙、可匿名读 | 推送需凭证 | 最常用的公开渠道 |
| SSH | git@github.com:user/repo.git | 加密、认证强、读写都方便 | 外网匿名只读不行 | 团队内部首选 |
| Git 协议 | git://...(9418 端口) | 最快 | 无认证无授权,基本只读 | 已很少用 |
日常结论:对外发布用 HTTPS,团队内部读写用 SSH。
服务器上放的是什么:裸仓库
普通仓库的工作目录里混着两样东西:.git 数据库和你正在编辑的文件。但远端仓库不需要工作目录——没人会登录到服务器上改代码,它只负责存历史、收推送。
所以服务端放的是裸仓库(bare repository):只有 Git 数据库,没有工作区。约定俗成目录名以 .git 结尾:
git init --bare /srv/git/myproject.git新手最常见的困惑
把带工作区的普通仓库目录直接当远端用,push 时会被 Git 拒绝(保护你不小心推到正在干活的分支)。远端一律用
--bare。
最小可用远端:SSH 方案三步走
1. 服务器上建裸仓库
ssh user@server
git init --bare /srv/git/myproject.git2. 本地生成 SSH 公钥(没有的话)
ssh-keygen -t ed25519 -C "your_email@example.com"
# 一路回车即可;公钥在 ~/.ssh/id_ed25519.pub把 .pub 公钥内容追加到服务器的 ~/.ssh/authorized_keys,私钥永远留在自己电脑上。
3. 本地添加远程并推送
git remote add origin user@server:/srv/git/myproject.git
git push -u origin main同事们用同样 URL 克隆、每人配好公钥,一个零成本团队 Git 服务就跑起来了。多个团队成员共用同一个系统账号时,可用 git-shell 把该账号限制成只能执行 Git 操作,增强安全性。
不想自己维护服务器:托管平台
自建意味着要管权限、备份、Web 界面。大多数团队选择托管服务:
- GitHub:全球最大开源社区,生态最强,协作流程(Issue/PR/Actions)事实标准。
- GitLab:可自建的开源全家桶,内置 CI/CD,企业内网常用。
- Gitee 等国内平台:国内访问速度快。
选型一句话:开源项目/个人项目 → GitHub;公司要私有部署 → GitLab;在意国内访问速度 → 国内托管。
小结
- 协议选型:公开读用 HTTPS,团队读写用 SSH。
- 远端仓库是裸仓库(无工作区),
git init --bare创建。 - SSH 远端三步:服务器建裸仓库 → 配公钥 →
remote add+push -u。 - 不想运维就用托管:GitHub / GitLab / 国内平台。
学完你会得到:
- 四种协议的选型依据
- 「裸仓库」概念与最小自建远端实操
- 托管平台的决策框架
自测
自测
- 裸仓库和普通仓库的区别是什么?为什么远端必须用裸仓库?
- SSH 方式下,哪把钥匙留在服务器上?哪把留在自己电脑上?
- 团队内部 8 个人共享读写,选哪种协议最合适?
git init和git init --bare生成的目录结构差在哪?- GitHub、GitLab 各自最典型的使用场景是什么?