Skip to content

git-cvsimport

命令名称 - 将您的数据从人们又爱又恨的另一个 SCM 中抢救出来

概要

bash
[verse]
'git cvsimport' [-o <branch-for-HEAD>] [-h] [-v] [-d <CVSROOT>]
	      [-A <author-conv-file>] [-p <options-for-cvsps>] [-P <file>]
	      [-C <git-repository>] [-z <fuzz>] [-i] [-k] [-u] [-s <subst>]
	      [-a] [-m] [-M <regex>] [-S <regex>] [-L <commit-limit>]
	      [-r <remote>] [-R] [<CVS-module>]

描述

警告: git cvsimport 使用 cvsps 版本 2,该版本已被视为弃用;它不适用于 cvsps 版本 3 及更高版本。如果您正在执行 CVS 仓库的一次性导入,请考虑使用 http://cvs2svn.tigris.org/cvs2git.html[cvs2git]https://gitlab.com/esr/cvs-fast-export[cvs-fast-export]。

将 CVS 仓库导入 Git。它将创建一个新仓库,或增量导入到现有仓库中。

将 CVS 日志拆分为补丁集由 cvsps 完成。至少需要版本 2.1。

警告: 在某些情况下,导入会导致不正确的结果。请参阅 <<issues,问题>> 部分以获取进一步参考。

永远不应在 git cvsimport 创建的分支上进行任何自己的工作。默认情况下,初始导入将从 CVS 仓库的主分支创建并填充一个"master"分支,您可以自由使用;之后,您需要自己 git merge 增量导入或任何 CVS 分支。建议通过 -r 指定命名的远程仓库,以分隔和保护传入的分支。

如果您打算设置一个所有开发者都可以读/写的共享公共仓库,或者如果您想使用 git-cvsserver(1),那么您可能想要对导入的仓库进行裸克隆,并将克隆用作共享仓库。参阅 gitcvs-migration(7)

选项

  • -v - 详细:让 cvsimport 报告它正在做什么。

  • -d <CVSROOT> - CVS 存档的根。可以是本地(简单路径)或远程;目前仅支持 :local:、:ext: 和 :pserver: 访问方法。如果未给定,git cvsimport 将尝试从 CVS/Root 读取。如果不存在此类文件,则检查 CVSROOT 环境变量。

  • <CVS-module> - 要导入的 CVS 模块。相对于 <CVSROOT>。如果未给定,git cvsimport 尝试从 CVS/Repository 读取。

  • -C <target-dir> - 要导入到的 Git 仓库。如果目录不存在,将被创建。默认为当前目录。

  • -r <remote> - 将此 CVS 仓库导入到的 Git 远程仓库。将所有 CVS 分支移动到 remotes/<remote>/<branch>,类似于 git clone 默认使用 'origin' 的方式。

  • -o <branch-for-HEAD> - 当未指定远程仓库(通过 -r)时,CVS 的 HEAD 分支被导入到 Git 仓库中的 'origin' 分支,因为 HEAD 对 Git 已有特殊含义。当指定远程仓库时,HEAD 分支被命名为 remotes/<remote>/master,镜像 git clone 行为。如果要导入到不同的分支,请使用此选项。 使用 '-o master' 继续最初由旧的 cvs2git 工具完成的导入。

  • -i - 仅导入:导入后不执行检出。此选项确保工作目录和索引保持不变,如果它们不存在则不会创建。

  • -k - 杀死关键字:将以 '-kk' 从 CVS 存档中提取文件以避免嘈杂的变更集。强烈推荐,但默认关闭以保持与早期导入树的兼容性。

  • -u - 将标签和分支名称中的下划线转换为点。

  • -s <subst> - 将分支名称中的字符 "/" 替换为 <subst>。

  • -p <options-for-cvsps> - cvsps 的附加选项。选项 -u 和 '-A' 是隐式的,不应在此处使用。 如果需要传递多个选项,请用逗号分隔。

  • -z <fuzz> - 将时间戳模糊因子传递给 cvsps(以秒为单位)。如果未设置,cvsps 默认为 300 秒。

  • -P <cvsps-output-file> - 不调用 cvsps,而是读取提供的 cvsps 输出文件。对于调试或在 cvsimport 外部处理 cvsps 时很有用。

  • -m - 尝试基于提交消息检测合并。此选项将启用默认正则表达式,尝试从提交消息中捕获源分支名称。

  • -M <regex> - 尝试使用自定义正则表达式基于提交消息检测合并。它可以与 -m 一起使用以同时启用默认正则表达式。您必须转义正斜杠。 正则表达式必须在 $1 中捕获源分支名称。 此选项可多次使用以提供多个检测正则表达式。

  • -S <regex> - 跳过匹配正则表达式的路径。

  • -a - 导入所有提交,包括最近的提交。cvsimport 默认跳过时间戳少于 10 分钟前的提交。

  • -L <limit> - 限制导入的提交数量。针对 cvsimport 泄漏内存的情况的解决方法。

  • -A <author-conv-file> - CVS 默认在写入提交日志时使用 Unix 用户名。使用此选项和作者转换文件可将 CVS 中记录的名称映射到作者姓名、电子邮件和可选时区:

    exon=Andreas Ericsson <ae@op5.se>
    spawn=Simon Pawn <spawn@frog-pond.org> America/Chicago

    git cvsimport 将使这些作者看起来好像他们的 GIT_AUTHOR_NAME 和 GIT_AUTHOR_EMAIL 一直设置正确。如果指定了时区,GIT_AUTHOR_DATE 将应用相应的偏移。

    为方便起见,每次提供 '-A' 选项时,此数据都会保存到 $GIT_DIR/cvs-authors,并且每次运行 git cvsimport 时都会从该文件读取。

    如果您打算稍后使用 git cvsexportcommit 将更改导出回 CVS,则不建议使用此功能。

  • -R - 生成包含 CVS 修订号到新创建的 Git 提交 ID 映射的 $GIT_DIR/cvs-revisions 文件。生成的文件将为每个导入的(文件名,修订)对包含一行;每行看起来像:

    src/widget.c 1.1 1d862f173cdc7325b6fa6d2ae1cfd61fd1b512b7

    如果文件已存在,修订数据将追加到文件中,用于增量导入时使用。

    如果您的提交消息、错误跟踪系统、电子邮件存档等中存储了 CVS 修订号,此选项可能很有用。

  • -h - 打印简短用法消息并退出。

输出

如果指定了 -v,脚本将报告它正在做什么。

否则,以 Unix 方式表示成功,即以零退出状态退出。

问题

与时间戳相关的问题:

  • 如果 CVS 仓库中提交的时间戳不够稳定,无法用于排序提交,更改可能会以错误的顺序显示。
  • 如果任何文件曾多次被"cvs import"(例如导入多个供应商发布版本),HEAD 包含错误的内容。
  • 如果不同文件的时间戳顺序在提交匹配时间窗口内交叉了修订顺序,提交的顺序可能是错误的。

与分支相关的问题:

  • 未进行任何提交的分支不会被导入。
  • 从分支点开始的所有文件都会被添加到分支中,即使在 CVS 中从未添加。
  • 这适用于在子分支创建添加到源分支的文件:如果先前未在子分支上进行过提交,它们将被错误地添加到 git 中的子分支。

与标签相关的问题:

  • 同一修订上的多个标签不会被导入。

如果您怀疑这些问题中的任何一个可能适用于要导入的仓库,请考虑使用 cvs2git:

  • cvs2git(cvs2svn 的一部分),https://subversion.apache.org/

Git

git(1) 套件的一部分

基于 CC BY-NC-SA 3.0 许可发布