2010-11-01 93 views
24

当我做了一个混帐SVN变基它停在一个点上说:(我才知道,这些SHA键对应于一棵树,而不是从上述两个SHA键混帐显示提交)如何解决git-svn索引不匹配问题?

Index mismatch: SHA key of a tree != SHA key of another tree.

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'](http://www.kernel.org/pub/software/scm/git/docs/git-fsck.html)。 – 2010-11-01 23:33:21

+0

@ Greg-Hewgill:谢谢你的建议。我做了一个git fsck,它列出了一堆悬挂的树木,提交和blob。我在参考Git用户手册中的这一部分:http://www.kernel.org/pub/software/scm/git/docs/user-manual.html#recovering-from-repository-corruption并尝试弄清楚什么发生在回购中。幸运的是,几周前,我将我的.git文件夹存档,以便我的同事起床并运行回购协议。我使用它并创建了一个新的回购协议,并继续我的工作,同时找出发生了什么事情。 – yasouser 2010-11-03 03:26:50

+0

唯一我能想到的是,在你做之前,别人可能会重新组装,因此改变了远程回购的SHA键,并给你现在看到的错误。如果您要对树所做的更改进行修改,修复所有冲突,然后重新绑定,可能会正常工作。 – g19fanatic 2010-11-04 13:27:10

回答

30

我有两次这个错误,并通过删除.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仓库的工作镜像。

+0

+1为简单起见;对于大型软件仓库来说确实是过分的,但是在大多数情况下,总体节省时间。 – 2011-03-07 17:26:07

+0

接受这个答案是因为,我的一个同事今天遇到了同样的问题(git索引不匹配),我们能够使用这里提出的方法恢复回购。由于回购是非常巨大的,但需要相当长的一段时间。 – yasouser 2011-05-05 19:24:38

+0

花了几个小时为我的1.2 GB回购重建svn索引数据,但它解决了这个问题。 – 2011-11-25 01:43:44

0

我自己只是有这个错误。只需删除参考,如下所示:

rm .git/refs/remotes/git-svn 

这应该清除错误。

+0

我在.git/refs/remotes目录下找不到git-svn!?! ?! – yasouser 2010-11-05 21:26:55

+1

对不起,我的错。这应该是'.git/refs/remotes/git-svn'。 – 2010-11-06 00:14:32

+0

我在.git/refs/remotes目录下没有git-svn文件!?!?! – yasouser 2010-11-08 14:13:31

1

的问题还有就是你必须在这种情况下,系统地做到这一点:

  • 使用git + SVN
  • 创建与混帐svn的
  • 合并分支的svn分支SVN工具干路
  • 删除SVN分支
  • 做一个git - svn的变基

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

29

请不要删除.git/svn文件夹来解决这个问题。它需要你重建所有的东西,这很烦人,它需要一段时间(我的回购数据库的大小需要几个小时),并不是必需的。

我找到了正确的答案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到你心中的内容。

+2

是的,我后来才找到这种技术。在我的下一次尝试中,我刚刚清除了“缓存”,比删除'.git/svn'要快得多。忘记在这里更新。感谢您发布您的答案。 – yasouser 2013-01-10 18:46:35

12

更新的git客户端和重取最后SVN提交使用:

git svn reset -r 12345 
git svn rebase 

其中12345现有SVN版本。

+1

这种情况下,摆弄'.caches'目录没有。 – krlmlr 2014-04-04 21:26:48

+1

这也是我工作的唯一方法。 – 2015-02-18 14:04:59

4

在我的情况下,这个问题是由一个新的/未知的svn作者造成的,他并没有在我的authors文件中配置git-svn。据报道它的输出,我忽略了前几​​曰:

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

所以这给了我失踪的名字,什么文件来添加它太(我从我的组织用户注册表拉着电子邮件),并且顺利航行。

0

我得到这个错误:

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再次正常工作。