## 名称

git-cvsimport - 将您的数据从另一个人们喜欢讨厌的 SCM 中拯救出来

## 概要

    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 <commitlimit>]              [-r <remote>] [-R] [<CVS_module>]

## 描述

警告： `git cvsimport`使用 cvsps 版本2，这被视为弃用; 它不适用于 cvsps 版本3和更高版本。如果您正在执行 CVS 存储库的一次性导入，请考虑使用cvs2git或cvs-fast-export。

将 CVS 存储库导入 Git。它将创建一个新的存储库，或者增量导入到现有的存储库中。

将 CVS 日志分割成补丁集是由`cvsps`。至少需要2.1版本。

警告：对于某些情况下导入导致不正确的结果。请参阅“问题”一节以作进一步参考。

你应该永远不会做由创建的分支自己的任何工作`git cvsimport`。默认情况下，初始导入将创建并填充 CVS 存储库的主分支的“主”分支，您可以自由使用该分支; 之后，您需要`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。类似于默认使用`origin`的`git clone`方式，将所有 CVS 分支移动到远程/ <远程> / <分支>中。

-o <branch-for-HEAD>

如果没有指定 remote（通过-r），则 CVS 的`HEAD`分支将被导入到 Git 存储库中的`origin`分支中，因为`HEAD`已经对 Git 有特殊意义。当指定远程时，`HEAD`分支命名为远程/远程/主镜像`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 用户名。使用此选项和 author-conv-file 将在 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

生成`$GIT_DIR/cvs-revisions`包含从 CVS 修订号到新创建的 Git 提交 ID 的映射的文件。生成的文件将为导入的每个（文件名，修订版）对包含一行; 每一行看起来像

    src/widget.c 1.1 1d862f173cdc7325b6fa6d2ae1cfd61fd1b512b7

如果修订数据已经存在，则修改数据会附加到该文件，以便在执行增量导入时使用。

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

-h

打印一条简短的使用信息并退出。

## 输出

如果`-v`指定，脚本报告它正在做什么。

否则，成功表示为 Unix 方式，即通过简单地以零退出状态退出。

## 问题

与时间戳有关的问题：

- 如果 CVS 存储库中的提交时间戳不够稳定，无法用于排序提交，则更改可能以错误的顺序显示。

- 如果有任何文件曾多次“cvs import”编辑过（例如，导入多个供应商版本），则 HEAD 包含错误的内容。

- 如果不同文件的时间戳顺序在提交匹配时间窗口内与修订订单相交，提交顺序可能是错误的。与分支有关的问题：

- 未提交任何提交的分支未导入。

- 即使从未添加到CVS中，分支点中的所有文件也会添加到分支中。

- 这适用于创建子分支后添加到源分支的文件：如果先前没有对子分支进行提交，它们将错误地添加到 git 中的子分支中。

与标签相关的问题：

- 不会导入同一修订版中的多个标记。如果您怀疑这些问题中的任何一个可能适用于要导入的存储库，请考虑使用 cvs2git：

- cvs2git (part of cvs2svn), `http://subversion.apache.org/`