我需要知道是否有办法将我的代码从CVS源代码控制迁移到Git?
如果是,我的提交历史怎么样?
答案 0 :(得分:22)
以下是我使用cvs2git(latest 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.options
是cvs2git
的JSON格式配置文件,您可以在其中为作者姓名等各种内容指定转换(以便在导入后将其昵称自动转换为其全名)。请参阅documentation here或included example options file。
此外,您不需要使用此方法拥有回购,您可以迁移您不拥有的SourceForge项目(您只需要有权结帐,所以这适用于任何公共回购)。
答案 1 :(得分:17)
我没有亲自完成从CVS到Git的转换,但我相信Eric Raymond的cvs-fast-export
是可以使用的工具。他发布了手册页here。 cvsps
是Eric维护的另一个工具,但它最近被弃用,而不是cvs-fast-export
。 cvs2git
是另一种工具,它建立在与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
https://github.com/$GITUSER/$PROJECT.git
答案 5 :(得分:0)
gaborous的answer使用git fast-import
,这可能会因UTF-8编码的日志消息 not 而失败。
这将与Git 2.23(2019年第二季度)更好地配合:“ git fast-export/import
”对被教导可以更好地处理采用UTF-8以外的编码的日志消息。 < / p>
请参见commit e80001f的commit 57a8be2,commit ccbfc96,commit 3edfcc6,commit 32615ce,Elijah 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的。
我建议这样做的原因是,当我发现其中的一个缺陷时,我能够向现有代码中添加我所缺少的功能-并不是那么糟糕。我的公关正在等待中,还有许多错误报告。