为什么git-cvsimport缺少一个主要的补丁集?

时间:2009-03-31 20:45:34

标签: git git-cvs

这是a previous question of mine的后续内容。

我可以查看cvsps的输出(保存在我的〜/ .cvsps目录中)并查看主要复杂提交的补丁集。但是当我执行cvsimport更新现有的git存储库时,这个提交不会显示出来。我知道git-cvsimport将忽略超过10分钟的补丁集,以避免导入不完整的CVS提交。我想我也听说它会跳过无法识别相关分支的补丁集。还有什么其他原因导致git-cvsimport无视我的提交?我该怎么调试呢?

以下是一些cvsps输出:

patchset: 50064
date: 1238445635
author: skiphoppy
tag: 
tag_flags: 0
branch: HEAD 
branch_add: 1
descr:
My log message

-=-END CVSPS DESCR-=-
members:
file:ordinaryChangedFile; pre_rev:1.44; post_rev:1.45; dead:0; branch_point:0
file:newFileRenamedAndModifiedFromOldFile; pre_rev:INITIAL; post_rev:1.1; dead:0; branch_point:0
file:deletedFileGoneBecauseRenamed; pre_rev:1.2; post_rev:1.3; dead:1; branch_point:0
...

branch_add:1行是否与它有关?整个存储库中只有9个这样的提交;其他50090提交说branch_add:0。除此之外,我不知道从cvsps或git-cvsimport的角度来看有什么不同。提交很复杂,涉及重命名几个文件并进行相关的内容修改。 CVS绝对难以处理。当然,git是一个快照,但当真正的后端是CVS时,git很难处理。

我必须再执行相同类型的复杂提交三次,而且由于cvsimport无法从CVS重新导入一个全新的git存储库,我无法花费4个半小时看到我的承诺。

更重要的是,我被我每天运行的git-cvsimport(我打算放入cron,甚至编写一个守护程序每隔五分钟左右运行一次)的事实吓坏了,这可能是 小姐 承诺将来!我发现没有办法git现有的存储库来获取这些提交;我只能在一个全新的存储库中运行git-cvsimport并永远等待,在我使用的时候失去了许多其他分支的使用。

4 个答案:

答案 0 :(得分:7)

嗯,这可能是问题所在。我的git-cvsimport行看起来像这样:

git cvsimport -p x ...

-p x应该将-x选项传递给cvsps,以告诉它忽略它之前运行时所留下的缓存输出。我认为这样做的主要原因是,最后几个可能不完整的补丁集将被丢弃并在下次运行时完成。事实证明,它可能会解决更多问题,而这可能就是其中之一。

我学会了从this blog entry以这种方式运行git cvsimport,这是目前Google上针对“git cvs”的最高点击率之一。它只是在上面的过程中,我试图通过cvsps输出的Perl调试器运行git-cvsimport,我必须检查并查看cvsps真正的参数。我了解到cvsps是这样运行的:

cvsps --norc x --cvs-direct ...

而不是:

cvsps --norc -x --cvs-direct ...

我实验验证了我从cvsps获得了不同的输出,缺少一些补丁集(我不知道模式是什么),当传递x而不是-x时。感谢Murphy定律,cvsps似乎没有报告这是一个问题,git-cvsimport从未见过它。

所以无论如何,git cvsimport需要像这样运行:

git cvsimport -p -x ...

此存储库的我以前的版本在这一点上完全被剔除了,但是我已经能够将最后一个问题提交强制转换为它们(虽然缺少一些早期的提交)。所以我再次经历了四个小时的导入过程,我希望那将是它!

最后一个提示:Windows上的git-cvsimport似乎根本不起作用。我获得的提交数量不到10%,尽管我确实找到了一棵类似于我们项目当前状态的树。它似乎缺乏几乎所有的历史......

答案 1 :(得分:3)

非常感谢!我有同样的问题,可以在你的帮助下解决它!

我甚至找到了一种避免从头开始重新运行cvsimport的方法。简单地将'master'和'origin'分支设置为较旧的git提交使cvsimport重新导入补丁,因为包括丢失的补丁:

找到比丢失的提交更早的提交ID:

  

git log

让'origin'指向该提交

  

git branch -f origin

切换到原点(这样'master'不是当前的HEAD)

  

git checkout origin

现在让'master'指向旧提交

  

git branch -f master origin

切换回主人

  

git checkout master

现在,时间完全回滚,你可以再次进行cvsimport,这次正确

  

git cvsimport ...

答案 2 :(得分:1)

我最近遇到过这样的事情 - 在git cvsimport之后,在CVS中有一个提交没有出现在git中;后来提交了(这让我很难,因为我之后制作了非工作补丁。

但是,修复很简单而且很愚蠢 - 我只是在丢失提交之前重置cvs / master分支,重新运行git cvsimport,然后就是。

答案 3 :(得分:-1)

嗯,好消息是git-cvsimport似乎是用Perl编写的,我碰巧是Perl程序员,所以也许我至少可以通过Perl调试器来解决这个问题,找出在提交过程中会发生什么

对于任何想要尝试此操作的人,您必须找到git-cvsimport的完整路径并使用-d开关将其提供给perl(Perl解释器):

perl -d /usr/local/libexec/git-core/git-cvsimport

我没有得到所有其他选项来做到这一点,但是......我需要直接输入git-cvsimport cvsps的输出,我认为......