【问题标题】:Why is git-cvsimport missing one major patchset?为什么 git-cvsimport 缺少一个主要补丁集?
【发布时间】:2010-10-16 17:20:06
【问题描述】:

这是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 很难处理。

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

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

【问题讨论】:

    标签: git git-cvs


    【解决方案1】:

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

    git cvsimport -p x ...
    

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

    我从this blog entry 学会了以这种方式运行 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%,尽管我最终得到了一棵类似于我们项目当前状态的树。它似乎缺少几乎所有的历史......

    【讨论】:

    • 老兄,这真的很有帮助。我用了同一个帖子,结果被烧了。
    • 很高兴听到它有帮助。 cvsimport 中仍然存在错误,但希望您不会遇到它们。 :) 您是在进行一次性转换,还是将来会被困在与原始 CVS 存储库的交互中?
    【解决方案2】:

    非常感谢!我遇到了同样的问题,可以在您的帮助下解决它!

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

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

    git 日志

    让'origin'指向那个提交

    git 分支 -f 来源

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

    git 结帐来源

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

    git branch -f master origin

    切换回主人

    git 结帐大师

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

    git cvsimport ...

    【讨论】:

    • 如果您以后不介意变基或以其他方式合并它,则无需重置 master。只是回滚原点为我解决了这个问题。
    【解决方案3】:

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

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

    【讨论】:

    • 酷。我将尝试这样做,尽管我没有意识到我可以移动 cvs/master(它是我 repo 中的一个远程分支)。我也很担心,因为如果第一次失败,我不明白为什么会这样。但至少它是一个正确方向的指针!
    • 对我来说也是一个远程分支。我隐约记得做了一些非常讨厌的事情——要么我使用了管道,要么(更有可能)我只是做了“echo 123456789abcdef > .git/refs/remotes/cvs/master”(那个 123... 应该是你想要的提交的 sha1重置为)
    • 我也看不出为什么提交被错过并第二次获得。你说你是一个 perl 程序员,你也许可以调试这个 - 尽管它会很讨厌,因为它只会在某个时间发生一次。
    • ...关于“我对远程分支所做的事情”的另一种可能性是我将其更改为具有相同名称的本地分支。我现在真的不确定。
    【解决方案4】:

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

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

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

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

    【讨论】:

    • 如果你弄明白了,我希望你能向 git 邮件列表提交一个错误或补丁或失败的单元测试,以便为使用这个(不幸的)必要工具的每个人解决这个问题.
    • 知道了!!!它终于又发生了……时间戳正好在十分钟前的补丁集将被跳过,后续的补丁集将被导入,然后你就完蛋了。我会报告的。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-11
    • 2015-05-21
    • 1970-01-01
    • 1970-01-01
    • 2011-07-06
    • 2014-08-06
    • 1970-01-01
    相关资源
    最近更新 更多