版本控制里的 client 是什么:客户端与服务器如何分工、该装哪一个
在版本控制语境里,client(客户端)是运行在你本机、由你直接操作的那一侧软件:它负责发起检出、更新、提交、查看历史等动作,并通过网络或本地协议与存放仓库的 server 通信。判断该装哪一个的标准很简单——你只是连接别人已有的仓库,装 client 就够;你要自己托管仓库、让别人连你,才需要 server。CVS/CVSNT 这类工具正是按这个分工组织的,march-hare.com 提供的下载也把 client 与 server 分开列出。
client 与 server 的职责边界
两者不是同一件事的两种叫法,而是明确分工的两端。
| 维度 | client(客户端) | server(服务端) |
|---|---|---|
| 运行位置 | 你的开发机 | 托管仓库的机器 |
| 核心职责 | 发起操作、把改动送出去、把别人的改动取回来 | 保存仓库、处理请求、维护版本历史与访问控制 |
| 典型动作 | checkout、update、commit、diff、log | 接受连接、鉴权、写入版本库、并发控制 |
| 是否持有仓库 | 通常只持有工作副本 | 持有权威仓库 |
关键点在于:仓库的权威副本在 server 上。client 上的文件是你正在编辑的工作副本,提交后改动才进入 server 的仓库。因此有些能力必须由服务端提供,客户端无法替代:
- 多人共享的中央仓库与版本历史
- 用户认证与访问权限控制
- 并发提交的协调与冲突处理
- 仓库的备份与长期保存
反过来,日常写代码、比对差异、解决冲突这些操作发生在 client 一侧,server 不参与你的编辑过程。
CVS/CVSNT 的客户端通常包含什么
以 CVS 和 CVSNT 为例,客户端软件一般提供两类使用方式:
- 命令行工具:如
cvs命令,用于检出、更新、提交、查看日志等,适合脚本化和习惯终端的用户。 - 图形客户端:把同样的操作包装成界面,降低记忆命令的成本,适合不常使用命令行的场景。
需要区分的是,CVSNT 是在传统 CVS 基础上发展出的实现,在 Windows 环境下同时提供客户端与服务端组件。march-hare.com 的下载页按平台(Windows、Linux、Mac OS X、HP-UX 等)和 client/server 角色分别列出,选择时要同时确认操作系统和你要的是哪一侧,两者都对了才是你要的那个包。
怎么判断自己该装 client 还是 server
按你的实际角色来定:
- 只连远程仓库:团队已经有一台服务器托管仓库,你只是拉代码、提交改动——装 client。
- 自建仓库:你想在自己机器或一台服务器上建立仓库,让其他人或自己连过来——装 server(很多情况下服务端包也附带客户端工具)。
- 本地单人使用:即使只有你一个人,只要想有版本历史,也需要一个仓库;可以用服务端组件在本地建库,再用客户端连它。
- 不确定时:先问“仓库放在哪、谁维护”。仓库在别人那里,你就是客户端。
常见误区
- 把 client 当成网站访客端:在版本控制里,client 指开发者本机的工具,与浏览器访问网站无关。
- 以为装了 client 就能托管仓库:client 只持有工作副本,无法充当别人连接的中央仓库。
- 忽略平台与角色两个维度:下载时只看系统、不看 client/server,容易拿错包。
- 以为客户端和服务端必须来自同一来源:CVS 生态里客户端与服务端可以来自不同实现,但版本兼容性需要自行确认,尤其是 CVSNT 与传统 CVS 混用时。
一句话收尾:先确定仓库由谁托管,再决定装哪一侧——连别人的仓库装 client,自己托管仓库装 server。