设置和配置
获取和创建项目
基本快照
分支与合并
共享和更新项目
检查和比较
打补丁
调试
电子邮件
外部系统
服务器管理
指南
管理
底层命令
- 2.50.1 → 2.52.0 无更改
-
2.50.0
2025-06-16
- 2.44.1 → 2.49.1 无更改
-
2.44.0
2024-02-23
- 2.42.1 → 2.43.7 无变更
-
2.42.0
2023-08-21
- 2.37.3 → 2.41.3 无更改
-
2.37.2
2022-08-11
- 2.33.2 → 2.37.1 无更改
-
2.33.1
2021-10-12
- 2.32.1 → 2.33.0 无更改
-
2.32.0
2021-06-06
- 2.25.1 → 2.31.8 无更改
-
2.25.0
2020-01-13
- 2.23.1 → 2.24.4 无更改
-
2.23.0
2019-08-16
- 2.18.1 → 2.22.5 无更改
-
2.18.0
2018-06-21
- 2.16.6 → 2.17.6 无更改
-
2.15.4
2019-12-06
- 2.10.5 → 2.14.6 无更改
-
2.9.5
2017-07-30
- 2.5.6 → 2.8.6 无更改
-
2.4.12
2017-05-05
- 2.3.10 无更改
-
2.2.3
2015-09-04
- 2.1.4 无更改
-
2.0.5
2014-12-17
概要
SSH
export CVS_SERVER="git cvsserver" cvs -d :ext:user@server/path/repo.git co <HEAD_name>
pserver (/etc/inetd.conf)
cvspserver stream tcp nowait nobody /usr/bin/git-cvsserver git-cvsserver pserver
用法
git-cvsserver [<options>] [pserver|server] [<directory> …]
描述
此应用程序是 Git 的 CVS 模拟层。
它功能强大。但是,并非所有方法都已实现,并且对于已实现的方法,并非所有开关都已实现。
已使用 CLI CVS 客户端和 Eclipse CVS 插件进行了测试。大多数功能在这两个客户端上都能正常工作。
选项
所有这些选项显然只有在服务器端强制执行时才有意义。它们已实现,以尽可能接近 git-daemon[1] 选项。
局限性
CVS 客户端无法标记、分支或执行 Git 合并。
git-cvsserver 将 Git 分支映射到 CVS 模块。这与大多数 CVS 用户期望的非常不同,因为在 CVS 中,模块通常代表一个或多个目录。
安装
-
如果您将通过 pserver 提供 CVS 访问,请在 /etc/inetd.conf 中添加一行,如下所示:
cvspserver stream tcp nowait nobody git-cvsserver pserver
注意:一些 inetd 服务器允许您独立于 argv[0] 的值(即程序假定它已被执行的名称)来指定可执行文件的名称。在这种情况下,/etc/inetd.conf 中的正确行如下所示:
cvspserver stream tcp nowait nobody /usr/bin/git-cvsserver git-cvsserver pserver
默认情况下,pserver 只提供匿名访问。要提交,您需要创建 pserver 帐户,只需在您希望 cvsserver 允许写入的存储库的配置文件中添加 gitcvs.authdb 设置,例如:
[gitcvs] authdb = /etc/cvsserver/passwd
这些文件的格式是用户名后跟加密密码,例如:
myuser:sqkNi8zPf01HI myuser:$1$9K7FzU28$VfF6EoPYCJEYcVQwATgOP/ myuser:$5$.NqmNH1vwfzGpV8B$znZIcumu1tNLATgV2l6e1/mY8RzhUDHMOaVOeL1cxV3
您可以使用 Apache 附带的 htpasswd 工具来创建这些文件,但只能使用 -d 选项(或者如果您的系统支持 -B 选项)。
最好使用您的平台中管理密码哈希创建的特定于系统的实用程序(例如,Linux 中的 mkpasswd,OpenBSD 中的 encrypt,或 NetBSD 中的 pwhash),然后将其粘贴到正确的位置。
然后通过 pserver 方法提供您的密码,例如:
cvs -d:pserver:someuser:somepassword@server:/path/repo.git co <HEAD_name>
SSH 访问不需要特殊设置,只需在 PATH 中包含 Git 工具即可。如果您有不支持 CVS_SERVER 环境变量的客户端,您可以将 git-cvsserver 重命名为
cvs。注意:较新版本的 CVS(>= 1.12.11)也支持在 CVSROOT 中直接指定 CVS_SERVER,如下所示:
cvs -d ":ext;CVS_SERVER=git cvsserver:user@server/path/repo.git" co <HEAD_name>
这样做的优点是它将保存在您的 CVS/Root 文件中,并且您不必担心始终设置正确的环境变量。仅限于 git-shell 的 SSH 用户无需覆盖默认的 CVS_SERVER(也不应该这样做),因为 git-shell 理解
cvs意味着 git-cvsserver,并且比实际运行真实 cvs 更好。 -
对于您希望通过 CVS 访问的每个仓库,您都需要编辑仓库中的 config 并添加以下部分。
[gitcvs] enabled=1 # optional for debugging logFile=/path/to/logfile注意:您需要确保每个将要调用 git-cvsserver 的用户对日志文件和数据库(请参阅 数据库后端)具有写入权限。如果您想通过 SSH 提供写入访问,用户当然也需要对 Git 存储库本身具有写入权限。
您还需要确保每个存储库都是“裸”(没有 Git 索引文件),以便
cvscommit正常工作。请参阅 gitcvs-migration[7]。所有配置变量也可以按访问方法覆盖,请参阅 上文。有效的访问方法名称是“ext”(用于 SSH 访问)和“pserver”。以下示例配置将禁用 pserver 访问,同时仍然允许通过 SSH 访问。
[gitcvs] enabled=0 [gitcvs "ext"] enabled=1 -
如果您没有在 checkout 命令中直接指定 CVSROOT/CVS_SERVER,自动将其保存在您的 CVS/Root 文件中,那么您需要在环境中显式设置它们。CVSROOT 应按正常方式设置,但目录应指向适当的 Git 仓库。如上所述,对于不限于 git-shell 的 SSH 客户端,CVS_SERVER 应设置为 git-cvsserver。
export CVSROOT=:ext:user@server:/var/git/project.git export CVS_SERVER="git cvsserver"
-
对于将要进行提交的 SSH 客户端,请确保他们的服务器端 .ssh/environment 文件(或 .bashrc 等,根据他们的特定 shell)导出 GIT_AUTHOR_NAME、GIT_AUTHOR_EMAIL、GIT_COMMITTER_NAME 和 GIT_COMMITTER_EMAIL 的适当值。对于登录 shell 为 bash 的 SSH 客户端,.bashrc 可能是一个合理的替代方案。
-
客户端现在应该能够检出项目。使用 CVS 模块名称来指示您想检出哪个 Git head。这也将设置您新检出目录的名称,除非您使用
-d<dir-name> 另行指定。例如,这将检出 master 分支到project-master目录cvs co -d project-master master
数据库后端
git-cvsserver 为每个 Git head(即 CVS 模块)使用一个数据库来存储有关存储库的信息,以维护一致的 CVS 版本号。每次提交后都需要更新(即写入)数据库。
如果提交是直接使用 git(而不是使用 git-cvsserver)完成的,则需要在下次 git-cvsserver 访问存储库时进行更新,而不管访问方法和请求的操作如何。
这意味着即使您只提供只读访问(例如,通过 pserver 方法),git-cvsserver 也应该具有对数据库的写入访问权限才能可靠工作(否则,您需要确保每次执行 git-cvsserver 时数据库都是最新的)。
默认情况下,它使用 Git 目录中的 SQLite 数据库,名为 gitcvs.<module-name>.sqlite。请注意,SQLite 后端在写入时会在数据库文件所在的目录中创建临时文件,因此授予使用 git-cvsserver 的用户对数据库文件的写入访问权限可能不足以让他们写入目录,也需要授予他们目录的写入权限。
在分支发生更改后,无法以一致的形式可靠地重新生成数据库。示例:对于合并的分支,git-cvsserver 只跟踪一个开发分支,并且在 git merge 之后,增量更新的数据库可能跟踪与从头开始重新生成的数据库不同的分支,从而导致不一致的 CVS 版本号。git-cvsserver 无法知道如果它在合并前以增量方式运行会选择哪个分支。因此,如果您必须完全或部分(从旧备份)重新生成数据库,您应该警惕预先存在的 CVS 沙盒。
您可以使用以下配置变量配置数据库后端:
配置数据库后端
git-cvsserver 使用 Perl DBI 模块。更改这些变量时,请也阅读其文档,特别是关于 DBI->connect() 的内容。
- gitcvs.dbName
-
数据库名称。确切含义取决于所选的数据库驱动程序,对于 SQLite,这是一个文件名。支持变量替换(见下文)。可能不包含分号(;)。默认值:%Ggitcvs.%m.sqlite
- gitcvs.dbDriver
-
使用的 DBI 驱动程序。您可以在此处指定任何可用驱动程序,但可能不起作用。cvsserver 已使用 DBD::SQLite 进行测试,据报告与 DBD::Pg 配合使用,据报告与 DBD::mysql不起作用。请将此视为实验性功能。可能不包含冒号(
:)。默认值:SQLite - gitcvs.dbuser
-
数据库用户。仅在设置
dbDriver时有用,因为 SQLite 没有数据库用户的概念。支持变量替换(见下文)。 - gitcvs.dbPass
-
数据库密码。仅在设置
dbDriver时有用,因为 SQLite 没有数据库密码的概念。 - gitcvs.dbTableNamePrefix
-
数据库表名前缀。支持变量替换(见下文)。任何非字母数字字符都将被替换为下划线。
所有变量也可以按访问方法设置,请参阅 上文。
Eclipse CVS 客户端注意事项
要使用 Eclipse CVS 客户端进行检出:
-
选择“创建新项目 → 从 CVS 检出”
-
创建新位置。有关如何选择正确协议的详细信息,请参阅下面的注意事项。
-
浏览可用的模块。它将为您提供存储库中 head 的列表。您将无法在此处浏览树。只能浏览 head。
-
在询问要检出的分支/标签时,选择
HEAD。取消选中“启动提交向导”以避免提交 .project 文件。
协议注意事项:如果您正在使用 pserver 进行匿名访问,请选择该选项。使用 SSH 访问的人员应选择 ext 协议,并在 Preferences→Team→CVS→ExtConnection 窗格中配置 ext 访问。将 CVS_SERVER 设置为“git cvsserver”。请注意,使用 ext 时密码支持不佳,您绝对需要设置 SSH 密钥。
或者,您也可以使用 Eclipse 提供的非标准 extssh 协议。在这种情况下,将忽略 CVS_SERVER,您必须将服务器上的 cvs 工具替换为 git-cvsserver 或修改您的 .bashrc,以便调用 cvs 有效地调用 git-cvsserver。
已知可正常工作的客户端
-
CVS 1.12.9 (Debian)
-
CVS 1.11.17 (MacOSX,来自 Fink 包)
-
Eclipse 3.0, 3.1.2 (MacOSX,请参阅 Eclipse CVS 客户端注意事项)
-
TortoiseCVS
支持的操作
正常使用所需的所有操作都得到支持,包括 checkout、diff、status、update、log、add、remove、commit。
大多数读取 CVS 标签或修订号的 CVS 命令参数(通常是 -r)都可以工作,并且还支持任何 git refspec(标签、分支、提交 ID 等)。但是,非默认分支的 CVS 修订号的模拟效果不佳,并且 cvs log 完全不显示标签或分支。(非主分支的 CVS 修订号表面上类似于 CVS 修订号,但实际上它们直接编码了 git 提交 ID,而不是代表自分支点以来的修订数量。)
请注意,有两种方法可以检出一个特定分支。如本页其他地方所述,cvs checkout 的“module”参数被解释为分支名称,它成为主分支。即使您使用 cvs update -r 暂时使另一个分支具有粘性,它对于给定的沙盒来说仍然是主分支。或者,-r 参数可以表示要实际检出的其他分支,即使模块仍然是“主”分支。权衡(当前实现):每个新的“模块”都会在磁盘上创建一个新的数据库,其中包含给定模块的历史记录,并且在创建数据库后,对该主分支的操作将很快。或者,-r 不会占用额外的磁盘空间,但对于许多操作(如 cvs update)可能非常慢。
如果您想引用一个包含 CVS 不允许的字符的 git refspec,您有两个选择。首先,直接将 git refspec 提供给适当的 CVS -r 参数可能有效;一些 CVS 客户端似乎并没有对该参数进行太多健全性检查。其次,如果失败,您可以使用特殊的字符转义机制,该机制仅使用 CVS 标签中有效的字符。形式为(下划线("_")、连字符("-")、一个或两个字符,以及连字符("-"))的 4 或 5 个字符序列可以根据一个或两个字母来编码各种字符:"s" 表示斜杠("/"),"p" 表示句点("."),"u" 表示下划线("_"),或者任意字节值的两个十六进制数字(通常是 ASCII 数字,或可能是 UTF-8 编码字符的一部分)。
不支持旧的监控操作(edit、watch 及相关操作)。目前不支持导出和标记(标签和分支)。
CRLF 行尾转换
默认情况下,服务器为所有文件保留 -k 模式为空,这会导致 CVS 客户端将它们视为文本文件,并在某些平台上进行行尾转换。
您可以通过设置 gitcvs.usecrlfattr 配置变量,让服务器使用行尾转换属性来设置文件的 -k 模式。有关行尾转换的更多信息,请参阅 gitattributes[5]。
或者,如果未启用 gitcvs.usecrlfattr 配置或属性不允许对文件名进行自动检测,则服务器使用 gitcvs.allBinary 配置作为默认设置。如果设置了 gitcvs.allBinary,则未其他指定的文件将默认为 -kb 模式。否则,-k 模式将留空。但是,如果 gitcvs.allBinary 设置为“guess”,那么将根据文件内容猜测正确的 -k 模式。
为了与 cvs 保持最佳一致性,最好通过将 gitcvs.usecrlfattr 设置为 true,并将 gitcvs.allBinary 设置为“guess”来覆盖默认设置。