🖥️ 服务器上的 Git:协议与自建远端

1次阅读
没有评论
这一篇在干嘛?

前面几篇你一直在用 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.git

2. 本地生成 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 / 国内平台。
学完你会得到:
  • 四种协议的选型依据
  • 「裸仓库」概念与最小自建远端实操
  • 托管平台的决策框架

自测

自测
  1. 裸仓库和普通仓库的区别是什么?为什么远端必须用裸仓库?
  2. SSH 方式下,哪把钥匙留在服务器上?哪把留在自己电脑上?
  3. 团队内部 8 个人共享读写,选哪种协议最合适?
  4. git init 和 git init --bare 生成的目录结构差在哪?
  5. GitHub、GitLab 各自最典型的使用场景是什么?

下一篇:[[git教程/git-07|🤝 分布式工作流:如何向项目贡献代码]]

正文完
 0