如何解决git-svn索引不匹配问题?

31

当我执行 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的内部运作并不熟悉,是否有一系列步骤可供遵循,以分析和可能解决此类问题?


3
如果怀疑代码仓库已损坏,我会尝试进行 git fsck 操作。 - Greg Hewgill
@Greg-Hewgill:感谢您的建议。我进行了git fsck并列出了一堆悬空的树、提交和blob。我正在参考Git用户手册中的这个部分:http://www.kernel.org/pub/software/scm/git/docs/user-manual.html#recovering-from-repository-corruption 并试图弄清楚仓库发生了什么事情。幸运的是,几周前我归档了我的.git文件夹,以便我的同事可以使用该文件夹快速上手。我使用了那个文件夹创建了一个新的仓库,并继续工作,同时我也在弄清楚发生了什么导致原来的仓库损坏。 - yasouser
我能想到的唯一可能是在你之前有其他人进行了变基操作,从而改变了远程仓库的SHA密钥,并导致你现在看到的错误。如果你先拉取树上所做的更改,解决任何冲突,然后再进行变基,那么它可能会正常工作。 - g19fanatic
你只看到了“悬挂提交”,没有遗漏的吗?这是相当正常的 - 当重新设置和使用git add时,会创建“悬挂提交”和“悬挂树” - 索引维护为一棵树。 - Andrew Aylett
@g19fanatic 远程仓库是一个 SVN 仓库,而 SVN 不支持历史重写,所以我不确定你的意思。 - Max Nanasy
10个回答

39
请不要删除 .git/svn 文件夹来解决这个问题。这将需要您重新构建所有内容,非常烦人,而且需要很长时间(对于我的 repo 来说需要几个小时),并且是没有必要的。
我在这里找到了正确的答案,并将其包含在下面。
从链接中得知:
在 .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 rebase 或者 git svn fetch


2
是的,我后来确实找到了这个技巧。在我的下一次尝试中,我只清除了“缓存”,比删除“.git/svn”要快得多。忘记在这里更新了。感谢您发布您的答案。 - yasouser
我也遇到了消息中的校验和不匹配问题,但这个解决方案在这种情况下并没有解决问题。 - Sergei Krivonos

38

我曾经遇到过这个错误,两次都是通过删除.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
对于简单的操作来说,这是一个加分项;对于大型代码库来说可能有点过度设计,但在大多数情况下,它能够节省时间。 - sam hocevar
2
对于我的大型代码库,我只获取了一些最新的提交记录:"git svn fetch -r 12345:HEAD"。我仍然可以看到先前的提交记录。 - Erdem
1
绝对过度和完全不必要。 - Matt Hulse
1
这至少应该附带一个警告。 - deuberger
1
添加 --log-window-size=5000(或更大)将大大加快获取速度。 - Ian Dunn
显示剩余4条评论

13

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

git svn reset -r 12345
git svn rebase

其中12345是现有的svn版本。


2
这在一个需要调整.caches目录无法解决的情况下起作用了。 - krlmlr

4

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

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

这让我找到了缺失的名称,以及要将其添加到哪个文件中(我从组织的用户注册表中提取了电子邮件地址),之后一切都很顺利。


1
很可能,您的信息同时也出现了校验和不匹配的情况:
我在这里找到了解决方案 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

1

问题在于你必须按照以下步骤系统地进行:

  • 使用 git + svn
  • 使用 git-svn 在 svn 上创建分支
  • 使用 svn 工具将分支合并到主干
  • 删除 svn 分支
  • 执行 git-svn rebase

如果有什么遗漏,一切都会崩溃。我知道的唯一恢复方式是删除 .git 中的所有 svn 并重新构建所有内容。这很烦人,需要一段时间!


0

我遇到了这个错误:

索引不匹配: <sha> != <sha> 重新读取 <svn/trunk中提交的提交的sha索引> ... 文件列表 ... 在提交 <sha> (r<svn rev>) 中未找到路径 <path>

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

我认为这是由于之前磁盘已满导致的。在使用 git svn reset -r 回到损坏的 Git 提交的修订版本后,git svn fetch 再次正常工作。


0

0

我自己也遇到了这个错误。只需删除引用即可,就像这样:

rm .git/refs/remotes/git-svn

那应该可以清除错误了。


我找不到.git/refs/remotes目录下的git-svn!?!? - yasouser
1
抱歉,我的错误。应该是.git/refs/remotes/git-svn - Michael Melanson
我在.git/refs/remotes目录下没有git-svn文件!?!? - yasouser
1
转念一想,看起来这实际上是一个不同的问题。我遇到了相同的“索引不匹配”错误,通过删除git-svn远程引用来解决了它,但我没有得到其余部分。 - Michael Melanson

0

在进行初始克隆期间,我遇到了这个问题,原来是有人创建了一个名为“trunk”的分支,与真正的主干发生了冲突。忽略/branches/trunk后,一切正常。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接