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

时间:2014-01-01 14:37:18

标签: git version-control cvs

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

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

8 个答案:

答案 0 :(得分:22)

以下是我使用cvs2gitlatest stable release is here将我的SourceForge CVS仓库迁移到Git的过程,但是IIRC我使用的是github dev版本),它可以在Windows和Linux上运行而无需任何编译需要,因为它只是Python:

  

如何从sourceforge CVS导入git   首先,你需要下载/检查整个历史记录的cvs repo(不仅仅是结帐HEAD / Trunk):

rsync -av rsync://PROJECT.cvs.sourceforge.net/cvsroot/PROJECT/\* cvs  
  

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

python cvs2git --blobfile="blob.dat" --dumpfile="dump.dat" --username="username_to_access_repo" --options=cvs2git.options --fallback-encoding utf-8 cvs  
  

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

     

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

mkdir gitexport/
cd gitexport
git init  
  

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

cat ../{blob,dump}.dat | git fast-import  
  

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

git reset --hard  
  

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

git push -u origin master  
  

当然,您需要在git remote add origin https://your_repo_url

之前

注意:cvs2git.optionscvs2git的JSON格式配置文件,您可以在其中为作者姓名等各种内容指定转换(以便在导入后将其昵称自动转换为其全名)。请参阅documentation hereincluded example options file

此外,您不需要使用此方法拥有回购,您可以迁移您不拥有的SourceForge项目(您只需要有权结帐,所以这适用于任何公共回购)。

答案 1 :(得分:17)

我没有亲自完成从CVS到Git的转换,但我相信Eric Raymond的cvs-fast-export是可以使用的工具。他发布了手册页herecvsps是Eric维护的另一个工具,但它最近被弃用,而不是cvs-fast-exportcvs2git是另一种工具,它建立在与cvs2svn相同的机制之上。后者非常娴熟,所以我很高兴cvs2git同样好。

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

答案 2 :(得分:10)

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

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

This answer详细介绍。

答案 3 :(得分:3)

我最近使用了Eric Raymond的2016(2016)reposurgeon来从sourceforge导入CVS repo到git。我非常惊喜,它运作得非常好。 在经历了cvs2svn和其他工具的经验之后,我毫不犹豫地推荐这种任务。

Eric发布了一个简单的迁移指南here

答案 4 :(得分:0)

为了将项目从sourceforge克隆到github,我执行了以下步骤。

if string.range(of: regex, options: .regularExpression)
        .location != NSNotFound {
    // do stuff if string matches regexp
}

PROJECT=some_sourceforge_project_name GITUSER=rubo77 rsync -av rsync://a.cvs.sourceforge.net/cvsroot/$PROJECT/\* cvs svn export --username=guest http://cvs2svn.tigris.org/svn/cvs2svn/trunk cvs2svn-trunk cp ./cvs2svn-trunk/cvs2git-example.options ./cvs2git.options vim cvs2git.options # edit run_options.set_project cvs2svn-trunk/cvs2git --options=cvs2git.options --fallback-encoding utf-8

创建一个空的git
https://github.com/$GITUSER/$PROJECT.git

答案 5 :(得分:0)

gaborousanswer使用git fast-import,这可能会因UTF-8编码的日志消息 not 而失败。

这将与Git 2.23(2019年第二季度)更好地配合:git fast-export/import”对被教导可以更好地处理采用UTF-8以外的编码的日志消息。 < / p>

请参见commit e80001fcommit 57a8be2commit ccbfc96commit 3edfcc6commit 32615ceElijah Newren (newren)(2019年5月14日)。
(由Junio C Hamano -- gitster --commit 66dc7b6中合并,2019年6月13日)

  

fast-export:仅在请求时才对提交消息进行自动重新编码

     

提交消息的自动重新编码(以及删除编码头)会损害进行可逆历史记录重写的尝试(例如sha1sum <-> sha256sum转换,某些子树重写),并且似乎与{ {1}}要求明确的用户请求以修改输出   (例如fast-export--signed-tags=strip)。
  添加用户可以用来指定的--tag-of-filtered-object=rewrite标志,与其他快速导出标志一样,将其默认设置为'--reencode'

这意味着Documentation/git-fast-export现在包括:

abort
  

指定如何处理提交对象中的 --reencode=(yes|no|abort):: 标头。

     
      
  • 当询问“ encoding”(默认设置)时,该程序将在遇到此类提交对象时死亡。
  •   
  • 如果选择“是”,则提交消息将被重新编码为UTF-8。
  •   
  • 使用'no',将保留原始编码。
  •   
     

abort:如果我们无法重新编码,请避免剥离编码标头

     

fast-export遇到带有'encoding'标头的提交时,它将尝试在UTF-8中重新编码,然后删除编码标头。
  但是,如果由于以下原因,它无法在UTF-8中重新编码,其中的字符之一   提交消息在旧的编码中无效,那么我们需要保留原始编码,否则我们将丢失理解原始提交消息中所有其他(有效)字符所需的信息。

     

fast-export:支持“编码”提交标头

     

由于git支持使用UTF-8以外的编码的提交消息,因此允许fast-import导入此类提交。
  这对于不想重新编码来自外部系统的提交消息的人员很有用,也可能对实现可逆的历史记录重写(例如sha1sum   <-> sha256sum过渡或子树工作)与在提交历史记录中使用了专门编码的Git存储库。

Documentation/git-fast-import现在包括:

  

编码`

     

可选的fast-import命令指示提交消息的编码。
  大多数提交都是UTF-8,并且省略了编码,但这允许将提交消息导入git,而无需先对其进行重新编码。


查看that test,该作者使用名称中包含非ASCII字符的作者,但没有 特殊的提交消息。
它通过检查其大小来检查重新编码为UTF-8是否有效:

  

如果未重新编码提交对象,则该提交对象将为240个字节。

     
      
  • 删除“ encoding”标头将删除20个字节。
  •   
  • 将iso-8859-7中的encoding iso-8859-7\n\xF0)中的Pi character π重新编码为UTF-8中的\360\xCF\x80)字节。
  •   
     

检查所需尺寸。

答案 6 :(得分:0)

使用 cvs2svn

从CVS迁移到Git
  

共享所有步骤以将CVS迁移到git   

  1.在anyDir

中创建目录cvsProject
Rsync: your cvs repo:  
 1. $rsync -av  CVSUserName@CVSipAdrress:/CVS_Path/ProjectName/*  ~/anyDir/ProjectName

2. cd $../cvs2svn-x.x.0 && ./cvs2git --options=cvs2git-example.options
3. $./cvs2git --blobfile=cvs2git-tmp/git-blob.dat \ --dumpfile=cvs2git-tmp/git-dump.dat \ --username=CVS_YOUR_USER_NAME \ /path_of_step(1)/cvsProject
Note: if get any encoding error then add this into above command:"--encoding=ascii --encoding=utf8 --encoding=utf16 --encoding=latin"
4. mkdir newGitRepo && cd newGitRepo 5. git init --bare 6. git fast-import --export-marks=/x.x.x/cvs2svn-2.5.0/cvs2git-tmp/git-marks.dat \

wow now you are done, now you can push your repo to git..

Referenece : [link1][2] ,[link2][2]
     

答案 7 :(得分:0)

最近,我在使用“ CVS远程访问程序”或crap(GitHub)上获得了成功,并且获得了相对令人满意的体验。

显然,它可以处理CVS存储库的各种复杂问题,而其他所有转换工具都不能/不能,但是我对细节并不精通。像cvs2git一样,它也遵循转储文件的路径,这些文件实际上是使用git-fast-import导入git的。

我建议这样做的原因是,当我发现其中的一个缺陷时,我能够向现有代码中添加我所缺少的功能-并不是那么糟糕。我的公关正在等待中,还有许多错误报告。