从CVS迁移到Git而不会丢失历史记录

Ahm*_*laa 37 git cvs version-control

我需要知道是否有办法将我的代码从CVS源代码控制迁移到Git?

如果是的话,我的提交历史怎么样?

gab*_*ous 23

以下是我使用cvs2git将SourceForge CVS repo迁移到Git的过程(最新的稳定版本在这里,但IIRC我使用的是github dev版本),它适用于Windows和Linux,无需任何编译,因为它只是Python:

如何从sourceforge CVS导入到git.
首先,您需要下载/签出整个历史记录的cvs repo(而不仅仅是结帐HEAD/Trunk):

rsync -av rsync://PROJECT.cvs.sourceforge.net/cvsroot/PROJECT/\* cvs  
Run Code Online (Sandbox Code Playgroud)

然后使用cvs2git(python脚本,适用于所有平台,无需编译):

python cvs2git --blobfile="blob.dat" --dumpfile="dump.dat" --username="username_to_access_repo" --options=cvs2git.options --fallback-encoding utf-8 cvs  
Run Code Online (Sandbox Code Playgroud)

这应该生成两个包含所有cvs历史记录的文件blob和dump.您可以在文本编辑器中打开它们以检查内容是否正确.

然后在另一个文件夹中初始化你的git repo:

mkdir gitexport/
cd gitexport
git init  
Run Code Online (Sandbox Code Playgroud)

然后将导出的cvs历史记录加载到git:

cat ../{blob,dump}.dat | git fast-import  
Run Code Online (Sandbox Code Playgroud)

然后将git提交光标放在历史记录的末尾:

git reset --hard  
Run Code Online (Sandbox Code Playgroud)

最后,也可以选择推送到远程git存储库:

git push -u origin master  
Run Code Online (Sandbox Code Playgroud)

当然你需要在git remote add origin https:// your_repo_url之前

注意:git remote add origin https://your_repo_url是一个JSON格式的配置文件cvs2git.options,您可以在其中为作者姓名等各种内容指定转换(以便在导入后将其昵称自动转换为其全名).请参阅此处文档包含的示例选项文件.

此外,您不需要使用此方法拥有repo,您可以迁移您不拥有的SourceForge项目(您只需要结帐权,因此这适用于任何公共存储库).

  • 浏览并尝试所有其他解决方案后,这个为我工作!:d (2认同)

Joh*_*ter 18

我个人没有完成从CVS到Git的转换,但我相信Eric Raymond cvs-fast-export是使用的工具.他在这里发布了手册页. cvsps是由Eric维护的另一个工具,但它最近被弃用了cvs-fast-export. cvs2git是另一种工具,建立在一些相同的机械上cvs2svn.后者非常擅长,所以我抱有很高的希望cvs2git.

有一点需要注意:CVS是一个非常破碎的RCS.它可能具有无法在Git中完全反映的内容.IOW,那里存在一些不匹配的阻抗,但是工具尽可能地努力保存.请务必检查您的转化情况,并对结果感到满意.你可能需要修复Git历史的一部分以获得更可接受的东西,但我怀疑你是否需要.

  • 我认为“cvs-fast-export”有一个很大的缺陷......它使用 C。这意味着调试问题更困难,特别是因为它在 stdout 上输出内容并从 stdin 读取内容。它还根据 CVS 修订版在 RCS 文件中的显示方式重新编号,如果您试图查明问题,这可能会令人困惑。尽管如此,这应该是公认的答案。+1 (2认同)
  • 我一开始尝试了 cvs2git,但它依赖于 anydbm 包和默认值以外的 dbm 引擎。当您安装了所有必需的 Python 库并使其运行时,您已经完成了 10 倍的下载和编译 cvs-fast-export 的工作,它不需要任何外部库。我发现 cvs-fast-export 在转换我的 CVS 存储库方面做得非常出色。 (2认同)

Chr*_*ris 12

您可以使用git-cvsimport将CVS存储库导入Git.默认情况下,这将检查每个修订版本,为您提供相对完整的历史记录.

根据您的操作系统,您可能需要单独安装支持.例如,在Ubuntu机器上,您需要git-cvs包.

这个答案更详细.

  • `git-cvsimport`在CVS历史中更具弹性,但会产生(无声)不连贯的结果.我一直在阅读有关类似问题的大量答案,并想知道有多少人使用具有真正"伤痕"和问题的存储库进行实际真实转换. (4认同)
  • 就我而言:“cvs-fast-export”没有导入任何历史记录,“cvs2git”甚至没有导入文件(示例选项文件上的错误),“git-cvsimport”而是使用非常接近*这个答案的语法来完成工作* 上面的链接 (2认同)