git-cvsserver
命令名称 - Git 的 CVS 服务器模拟器
概要
SSH:
[verse]
export CVS_SERVER="git cvsserver"
'cvs' -d :ext:user@server/path/repo.git co <HEAD_name>
pserver (/etc/inetd.conf):
[verse]
cvspserver stream tcp nowait nobody /usr/bin/git-cvsserver git-cvsserver pserver
Usage:
[verse]
'git-cvsserver' [<options>] [pserver|server] [<directory> ...]描述
此应用程序是 Git 的 CVS 模拟层。
它功能强大。但是,并非所有方法都已实现,对于已实现的方法,也并非所有开关都已实现。
已使用 CLI CVS 客户端和 Eclipse CVS 插件进行了测试。大多数功能在这两个客户端上都能正常工作。
选项
所有这些选项显然只有在服务器端强制执行时才有意义。它们的实现尽可能接近 git-daemon(1) 选项。
--base-path <path>- 在请求的 CVSROOT 前加上 'path'。--strict-paths- 不允许递归进入子目录。--export-all- 不检查配置中的gitcvs.enabled。如果要使用此选项,还必须指定允许的目录列表(见下文)。-V/--version- 打印版本信息并退出。-h/-H/--help- 打印用法信息并退出。<directory>- 其余参数提供目录列表。如果未给定目录,则允许所有目录。这些目录中的仓库仍然需要gitcvs.enabled配置选项,除非指定了--export-all。
限制
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 访问的仓库,您需要编辑仓库中的配置并添加以下部分。
[gitcvs] enabled=1如果您未在检出命令中直接指定 CVSROOT/CVS_SERVER,自动将其保存在您的 'CVS/Root' 文件中,那么您需要在环境中显式设置它们。CVSROOT 应按常规设置,但目录应指向相应的 Git 仓库。如上所述,对于不受 'git-shell' 限制的 SSH 客户端,CVS_SERVER 应设置为 'git-cvsserver'。
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 '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- 数据库表名前缀。支持变量替换(见下文)。任何非字母字符将被替换为下划线。
所有变量也可以按访问方法设置,参见上面的配置访问方法。
变量替换
在 dbDriver 和 dbUser 中,您可以使用以下变量:
%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>...参数列表。仓库仍然需要gitcvs.enabled配置选项,除非指定了--export-all。
当设置了这些环境变量时,不能使用相应的命令行参数。
Eclipse CVS 客户端说明
要使用 Eclipse CVS 客户端进行检出:
- 选择 "Create a new project -> From CVS checkout"
- 创建新位置。有关如何选择正确协议的详细信息,请参阅下面的说明。
- 浏览可用的 'modules'。它将给您仓库中 heads 的列表。您将无法从那里浏览树。只有 heads。
- 当它询问要检出哪个分支/标签时,选择
HEAD。取消勾选 "launch commit wizard" 以避免提交 .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'。
已知可工作的客户端
- Debian 上的 CVS 1.12.9
- MacOSX 上的 CVS 1.11.17(来自 Fink 包)
- MacOSX 上的 Eclipse 3.0、3.1.2(参见 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 参数可以指示实际要检出的其他分支,即使模块仍然是"主"分支。权衡(按当前实现):每个新"module"在磁盘上创建一个具有给定模块历史记录的新数据库,数据库创建后,对该主分支的操作是快速的。或者,-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) 套件的一部分
