简体中文 ▾ 主题 ▾ 最新版本 ▾ git-cvsserver 最后更新于 2.44.0

名称

git-cvsserver - Git 的 CVS 服务器模拟器

概要

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] 选项。

--base-path <path>

将 *path* 添加到请求的 CVSROOT

--strict-paths

不允许递归到子目录中

--export-all

不要检查配置中的 gitcvs.enabled。 如果要使用此选项,还必须指定允许的目录列表(请参见下文)。

-V
--version

打印版本信息并退出

-h
-H
--help

打印用法信息并退出

<directory>

其余参数提供目录列表。 如果未给出目录,则允许所有目录。除非指定了--export-all,否则这些目录中的存储库仍然需要gitcvs.enabled配置选项。

限制

CVS 客户端无法标记、分支或执行 Git 合并。

git-cvsserver 将 Git 分支映射到 CVS 模块。 这与大多数 CVS 用户期望的非常不同,因为在 CVS 中,模块通常代表一个或多个目录。

安装

  1. 如果要通过 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>

    除了 PATH 中有 Git 工具外,SSH 访问不需要特殊设置。 如果您的客户端不接受 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 更好。

  2. 对于您希望从 CVS 访问的每个存储库,您需要在存储库中编辑配置并添加以下部分。

       [gitcvs]
            enabled=1
            # optional for debugging
    	logFile=/path/to/logfile

    注意:您需要确保将调用 git-cvsserver 的每个用户都具有对日志文件和数据库的写入访问权限(请参阅 数据库后端)。 如果您想通过 SSH 提供写入访问权限,那么用户当然也需要对 Git 存储库本身的写入访问权限。

    您还需要确保每个存储库都是“裸”(没有 Git 索引文件)以使 cvs commit 工作。 请参阅 gitcvs-migration[7]

    所有配置变量也可以为特定的访问方法覆盖。 有效的方法名称是 "ext"(用于 SSH 访问)和 "pserver"。 以下示例配置将禁用 pserver 访问,同时仍然允许通过 SSH 访问。

       [gitcvs]
            enabled=0
    
       [gitcvs "ext"]
            enabled=1
  3. 如果您没有直接在 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"
  4. 对于将进行提交的 SSH 客户端,请确保其服务器端 .ssh/environment 文件(或 .bashrc 等,根据其特定 shell)为 GIT_AUTHOR_NAME、GIT_AUTHOR_EMAIL、GIT_COMMITTER_NAME 和 GIT_COMMITTER_EMAIL 导出适当的值。 对于登录 shell 是 bash 的 SSH 客户端,.bashrc 可能是一个合理的选择。

  5. 客户端现在应该能够检出项目。 使用 CVS module 名称来指示您要检出的 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

数据库表名前缀。支持变量替换(见下文)。任何非字母字符将被替换为下划线。

所有变量也可以针对每种访问方法进行设置,请参阅上面

变量替换

dbDriverdbUser 中,您可以使用以下变量

%G

Git 目录名称

%g

Git 目录名称,其中除了字母数字字符、.- 之外的所有字符都替换为 _ (如果需要,这应该使在文件名中使用目录名称更容易)

%m

CVS 模块/Git head 名称

%a

访问方法(“ext”或“pserver”之一)

%u

运行 git-cvsserver 的用户的名称。如果无法确定名称,则使用数字 uid。

环境变量

这些变量在某些情况下免去了对命令行选项的需求,从而允许通过 git-shell 更容易地进行受限使用。

GIT_CVSSERVER_BASE_PATH

此变量替换 --base-path 的参数。

GIT_CVSSERVER_ROOT

此变量指定单个目录,替换 <directory>... 参数列表。除非指定 --export-all,否则存储库仍然需要 gitcvs.enabled 配置选项。

设置这些环境变量后,不能使用相应的命令行参数。

ECLIPSE CVS 客户端注意事项

要使用 Eclipse CVS 客户端进行检出

  1. 选择“创建新项目 → 从 CVS 检出”

  2. 创建一个新位置。有关如何选择正确协议的详细信息,请参阅以下说明。

  3. 浏览可用的模块。它会给你一个存储库中的 heads 列表。您将无法从那里浏览树。只有 heads。

  4. 当它询问要检出哪个分支/标签时,选择 HEAD。取消选中“启动提交向导”以避免提交 .project 文件。

协议说明:如果您使用 pserver 进行匿名访问,只需选择该选项。使用 SSH 访问的用户应选择 ext 协议,并在“首选项→团队→CVS→ExtConnection”窗格上配置 ext 访问。将 CVS_SERVER 设置为 "git cvsserver"。请注意,使用 ext 时,密码支持不太好,您肯定需要设置 SSH 密钥。

或者,您可以只使用 Eclipse 提供的非标准 extssh 协议。在这种情况下,CVS_SERVER 将被忽略,您必须用 git-cvsserver 替换服务器上的 cvs 实用程序,或者操作您的 .bashrc,以便调用 cvs 有效地调用 git-cvsserver

已知可工作的客户端

  • Debian 上的 CVS 1.12.9

  • MacOSX 上的 CVS 1.11.17(来自 Fink 包)

  • MacOSX 上的 Eclipse 3.0、3.1.2(请参阅 Eclipse CVS 客户端注意事项)

  • TortoiseCVS

支持的操作

支持正常使用所需的所有操作,包括检出、差异、状态、更新、日志、添加、删除、提交。

大多数读取 CVS 标签或修订号的 CVS 命令参数(通常为 -r)都可以工作,并且还支持任何 git refspec(标签、分支、提交 ID 等)。但是,非默认分支的 CVS 修订号并没有很好地模拟,并且 cvs log 根本不显示标签或分支。(非主分支 CVS 修订号表面上类似于 CVS 修订号,但它们实际上直接编码 git 提交 ID,而不是表示自分支点以来的修订数。)

请注意,有两种方法可以检出特定的分支。如本页其他地方所述,cvs checkout 的“module”参数被解释为分支名称,它成为主分支。即使您使用 cvs update -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”来覆盖默认值。

依赖

git-cvsserver 依赖于 DBD::SQLite。

GIT

属于 git[1] 套件的一部分

scroll-to-top