【问题标题】:How do I resolve a git-svn index mismatch?如何解决 git-svn 索引不匹配?
【发布时间】:2010-11-01 23:27:13
【问题描述】:

当我做了一个 git svn rebase 时,它​​停在了一个地方说:

Index mismatch: SHA key of a tree != SHA key of another tree.(我知道这些 SHA 键对应于一棵树,而不是来自 git show 的上述两个 sha 键的提交。)

re-reading <sha index of a commit in svn/trunk>
... list of files ...
fatal: bad object <SHA1 index of the bad object>
rev-list -1 <SHA1 index of the bad object> --not <SHA1 index of the revision it was trying to re-read>: command returned error: 128

我对 git 的内部工作不是很有经验,所以有没有一系列步骤可以用来剖析这些问题并可能解决它们?

【问题讨论】:

  • 首先想到我会尝试使用疑似损坏的存储库是git fsck
  • @Greg-Hewgill:感谢您的建议。我做了一个 git fsck ,它列出了一堆悬空的树、提交和 blob。我指的是 Git 用户手册中的这一部分:kernel.org/pub/software/scm/git/docs/… 并尝试弄清楚 repo 中发生了什么。幸运的是,几周前我存档了我的 .git 文件夹,以便我的同事启动并运行 repo。我使用它并创建了一个新的存储库并继续我的工作,同时我找出损坏的存储库发生了什么。
  • 我能想到的唯一一件事是其他人可能在您之前重新设置了基础,从而更改了远程仓库的 SHA 密钥并给您现在看到的错误。如果您要拉出对树所做的更改,修复任何冲突,然后从那里变基,它可能会正常工作。
  • 你只看到了悬空提交,没有丢失的提交?这是相当正常的——当使用git add 时,在变基和悬挂树时会创建悬挂提交——索引被维护为一棵树。
  • @g19fanatic 远程仓库是SVN仓库,SVN不支持历史重写,所以不太清楚你的意思

标签: git svn indexing git-svn rebase


【解决方案1】:

请不要删除 .git/svn 文件夹来解决此问题。它需要您重建所有内容,这很烦人,需要一段时间(对于我的 repo 的大小来说,需要几个小时)而且这不是必需的。

我找到了正确的答案here,并将其包含在下面。

来自链接:

在 .git 目录中运行以下命令:

$ find . -exec grep -Hin 5b32d4ac2e03a566830f30a702523c68dbdf715b {} \;
Binary file ./svn/.caches/lookup_svn_merge.db matches
Binary file ./svn/.caches/check_cherry_pick.db matches

现在从第一个命令的输出中删除匹配的 .svn/.caches

$ rm ./svn/.caches/lookup_svn_merge.db
$ rm ./svn/.caches/check_cherry_pick.db

现在git svn rebasegit svn fetch 尽情享受吧。

【讨论】:

  • 是的,我后来确实发现了这种技术。在我的下一次尝试中,我刚刚清除了caches,它比删除.git/svn 快得多。这里忘记更新了。感谢您发布您的答案。
  • 我在消息中同时也有校验和不匹配,在这种情况下这个解决方案没有解决问题。
【解决方案2】:

我遇到过两次这个错误,两次都是通过删除 .git 文件夹中的 svn 文件夹来解决的。

rm -r .git/svn

然后重建 svn 元数据:

git svn fetch

您可能会看到类似以下内容的消息:

Migrating from a git-svn v1 layout...
Data from a previous version of git-svn exists, but
    .git/svn
    (required for this version (1.7.0.4) of git-svn) does not exist.
Done migrating from a git-svn v1 layout

一段时间后(重建可能需要一段时间,尤其是在大型存储库上)您应该再次获得 svn 存储库的工作镜像。

【讨论】:

  • +1 为简单起见;对于大型存储库来说,这确实有点矫枉过正,但在大多数情况下可以节省整体时间。
  • 对于我的大型存储库,我只获取了一些最新提交:“git svn fetch -r 12345:HEAD”。我仍然可以看到以前的提交。
  • 绝对是矫枉过正,完全没有必要。
  • 这至少应该带有警告。
  • 添加--log-window-size=5000(或更大)将大大加快获取速度。
【解决方案3】:

使用以下命令更新 git 客户端并重新获取最后一次 svn 提交:

git svn reset -r 12345
git svn rebase

其中 12345 是现有的 svn 修订版。

【讨论】:

  • 这适用于摆弄.caches 目录的情况。
【解决方案4】:

在我的情况下,问题是由一个新的/未知的 svn 作者引起的,他不在我的 git-svn 配置使用的 authors 文件中。它在输出中报告说我忽略了前几​​个读取:

Index mismatch: <leftsha1> != <rightsha1>
rereading <anothersha1>
        ... list of files ...
Author: <name> not defined in /path/to/authors file

所以这给了我我缺少的名称,以及要添加的文件(我从我的组织用户注册表中提取了电子邮件)并且一帆风顺。

【讨论】:

    【解决方案5】:

    问题在于,在这种情况下,您必须系统地执行此操作:

    • 使用 git + svn
    • 用 git-svn 在 svn 上创建分支
    • 使用 svn 工具将分支合并到主干
    • 移除 svn 分支
    • 做一个 git-svn 变基

    有些东西不见了,一切都崩溃了。我知道恢复的唯一方法是删除 .git 中的所有 svn 并重建所有内容。这很烦人,需要一段时间!

    【讨论】:

      【解决方案6】:

      我自己也遇到了这个错误。只需删除 ref,如下所示:

      rm .git/refs/remotes/git-svn
      

      这应该可以清除错误。

      【讨论】:

      • 我在 .git/refs/remotes 目录下找不到 git-svn!?!?!
      • 对不起,我的错误。那应该是.git/refs/remotes/git-svn
      • 我在 .git/refs/remotes 目录下没有 git-svn 文件!?!?!
      • 转念一想,这似乎是一个不同的问题。我遇到了同样的“索引不匹配”错误,我通过删除 git-svn 远程引用修复了该错误,但我没有得到其余部分。
      【解决方案7】:

      可能与您的文件系统(ext4/btrfs/etc...)的 Copy-On-Write 功能有关?

      见:https://stackoverflow.com/a/42299634/7491491

      【讨论】:

        【解决方案8】:

        我收到了这个错误:

        Index mismatch: <sha> != <sha> re-reading <sha index of a commit in svn/trunk> ... list of files ... <path> was not found in commit <sha> (r<svn rev>)

        在 SVN 存储库中查看报告路径的历史记录,我找到了添加文件的 SVN 修订版。但是在 Git 中查看为该修订创建的提交时,我发现它不包含任何文件!

        我认为这是之前磁盘已满造成的。在执行git svn reset -r 回到损坏的 Git 提交的修订版后,git svn fetch 再次正常工作。

        【讨论】:

          【解决方案9】:

          我在最初的克隆过程中遇到了这个问题,结果发现有人创建了一个名为 trunk 的分支,它与真正的 trunk 冲突。忽略 /branches/trunk 后一切正常

          【讨论】:

            【解决方案10】:

            您的消息中可能同时存在校验和不匹配:

            我在这里找到了解决方案Git svn rebase : checksum mismatch:

            git svn log <item with checksum mismatch>
            git svn reset -r<top history revision in the log> -p
            git svn rebase
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2016-11-14
              • 1970-01-01
              • 2010-09-11
              • 2011-03-10
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多