5

这是我之前的问题的后续。

我可以查看 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 很难处理。

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

更重要的是,我担心我每天运行的 git-cvsimport(我打算将其放入 cron,或者甚至编写一个守护进程每五分钟左右运行一次)可能会在未来错过提交!我没有找到 git 现有存储库来获取这些提交的方法;我只能在一个全新的存储库中运行 git-cvsimport 并永远等待,而我在使用它时会失去对许多其他分支的使用。

4

4 回答 4

7

好吧,这可能是问题所在。我的 git-cvsimport 行如下所示:

git cvsimport -p x ...

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

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

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

代替:

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

而且我通过实验验证,当传递 x 而不是 -x 时,我从 cvsps 得到不同的输出,缺少一些补丁集(我不知道模式是什么)。由于墨菲定律,cvsps 似乎没有报告这是一个问题,而且 git-cvsimport 从来没有看到它。

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

git cvsimport -p -x ...

在这一点上,我以前版本的这个存储库完全被淹没了,但我已经能够强制将最后一个问题提交到它们中(不过,一些早期的提交丢失了)。所以我又经历了四个小时的导入过程,我希望就是这样!

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

于 2009-04-02T14:16:35.057 回答
3

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

我什至找到了一种避免从头开始重新运行 cvsimport 的方法。只需将“master”和“origin”分支设置为较旧的 git 提交,就可以让 cvsimport 重新导入补丁,因为包括缺失的补丁:

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

混帐日志

使“原点”指向该提交

git 分支 -f 起源

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

git结帐来源

现在让'master'指向旧的提交

git 分支 -f 主原点

切换回主人

git结账大师

现在,时间完全倒退了,您可以再次执行 cvsimport,这次是正确的

git cvs 导入...

于 2010-03-17T13:40:40.820 回答
1

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

然而,修复简单而愚蠢——我只是在丢失提交之前重置了 cvs/master 分支,重新运行 git cvsimport,它就在那里。

于 2009-03-31T21:27:53.800 回答
-1

嗯,好消息是 git-cvsimport 似乎是用 Perl 编写的,而我恰好是一名 Perl 程序员,所以也许我至少可以使用 Perl 调试器逐步了解该提交期间发生的情况。

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

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

我还没有找到所有其他选项来解决这个问题,但是......我需要直接将 git-cvsimport 提供 cvsps 的输出,我想......

于 2009-03-31T21:38:37.207 回答