2012-07-22 1822 views
5

我的git安装程序有一个中央存储库,我推送它。今天,我决定使用Git Extensions来查看中央存储库,并且它表示回购没有提交(就好像回购从未创建过)。调查这个问题,我试图克隆回购协议,它给了我一些奇怪的错误,我从来没有见过:Git错误“non-monotonic index”

error: non-monotonic index C:/Temp/N1/Netduino/.git/objects/pack/pack-29a18084cf61cd0322a6e9cfd485ce0977348c53.idx 
error: non-monotonic index C:/Temp/N1/Netduino/.git/objects/pack/pack-29a18084cf61cd0322a6e9cfd485ce0977348c53.idx 
error: non-monotonic index C:/Temp/N1/Netduino/.git/objects/pack/pack-29a18084cf61cd0322a6e9cfd485ce0977348c53.idx 
error: non-monotonic index C:/Temp/N1/Netduino/.git/objects/pack/pack-29a18084cf61cd0322a6e9cfd485ce0977348c53.idx 
error: non-monotonic index C:/Temp/N1/Netduino/.git/objects/pack/pack-29a18084cf61cd0322a6e9cfd485ce0977348c53.idx 
error: non-monotonic index C:/Temp/N1/Netduino/.git/objects/pack/pack-29a18084cf61cd0322a6e9cfd485ce0977348c53.idx 
error: non-monotonic index C:/Temp/N1/Netduino/.git/objects/pack/pack-29a18084cf61cd0322a6e9cfd485ce0977348c53.idx 
error: non-monotonic index C:/Temp/N1/Netduino/.git/objects/pack/pack-29a18084cf61cd0322a6e9cfd485ce0977348c53.idx 
error: non-monotonic index C:/Temp/N1/Netduino/.git/objects/pack/pack-29a18084cf61cd0322a6e9cfd485ce0977348c53.idx 
error: non-monotonic index C:/Temp/N1/Netduino/.git/objects/pack/pack-29a18084cf61cd0322a6e9cfd485ce0977348c53.idx 
error: non-monotonic index C:/Temp/N1/Netduino/.git/objects/pack/pack-29a18084cf61cd0322a6e9cfd485ce0977348c53.idx 
error: non-monotonic index C:/Temp/N1/Netduino/.git/objects/pack/pack-29a18084cf61cd0322a6e9cfd485ce0977348c53.idx 
error: non-monotonic index C:/Temp/N1/Netduino/.git/objects/pack/pack-29a18084cf61cd0322a6e9cfd485ce0977348c53.idx 
error: non-monotonic index C:/Temp/N1/Netduino/.git/objects/pack/pack-29a18084cf61cd0322a6e9cfd485ce0977348c53.idx 
error: non-monotonic index C:/Temp/N1/Netduino/.git/objects/pack/pack-29a18084cf61cd0322a6e9cfd485ce0977348c53.idx 
error: non-monotonic index C:/Temp/N1/Netduino/.git/objects/pack/pack-29a18084cf61cd0322a6e9cfd485ce0977348c53.idx 
error: non-monotonic index C:/Temp/N1/Netduino/.git/objects/pack/pack-29a18084cf61cd0322a6e9cfd485ce0977348c53.idx 
error: non-monotonic index C:/Temp/N1/Netduino/.git/objects/pack/pack-29a18084cf61cd0322a6e9cfd485ce0977348c53.idx 
error: non-monotonic index C:/Temp/N1/Netduino/.git/objects/pack/pack-29a18084cf61cd0322a6e9cfd485ce0977348c53.idx 
error: non-monotonic index C:/Temp/N1/Netduino/.git/objects/pack/pack-29a18084cf61cd0322a6e9cfd485ce0977348c53.idx 
error: non-monotonic index .git/objects/pack/pack-29a18084cf61cd0322a6e9cfd485ce0977348c53.idx 
error: non-monotonic index C:/Temp/N1/Netduino/.git/objects/pack/pack-29a18084cf61cd0322a6e9cfd485ce0977348c53.idx 
fatal: unable to read tree cc90183a1571664f80712c0376f59afeb681303f 

我已搜查谷歌这个问题,也有关于这一问题上StackOverlow另一个问题,但它仍然没有答案(this question)。任何人都可以解释这个问题?由于

回答

5

(不是一个完整的答案,但至少有一些线索,和解决方法)

该错误消息来自sha1_file.c, method check_packed_git_idx()

nr = 0; 
index = idx_map; 
if (version > 1) 
    index += 2; /* skip index header */ 
for (i = 0; i < 256; i++) { 
    uint32_t n = ntohl(index[i]); 
    if (n < nr) { 
    munmap(idx_map, idx_size); 
    return error("non-monotonic index %s", path); 
    } 
    nr = n; 
} 

ntohl function being

的ntohl函数将u_long从TCP/IP网络顺序转换为主机字节顺序(这在英特尔处理器上是小端)。

ntohl函数返回netlong参数中提供的值,并颠倒字节顺序。如果netlong已经处于主机字节顺序,那么这个函数会反转它。应用程序决定是否必须颠倒字节顺序。

ntohl函数采用在TCP/IP网络字节顺序的32位数字(或AF_INETAF_INET6地址族),并在主机字节顺序返回一个32位的数字。

看到一个包文件的结构在SO问题 “Is the git binary diff algorithm (delta storage) standardized?”:

它被称为

pack file structure

第一个也被称为builtin/fsck.c,所以你可以尝试一个git fsck --full --progress,以检查你的包文件是否有本地损坏,或者它是否真的是远程回购问题。
确保您可以在不同的操作系统和/或不同版本的Git上复制问题。

通常的解决办法,对于一个(在这里“Netduino”)的回购协议,这似乎是在GitHub上围绕分叉,就是:

  • 克隆另一个叉,
  • 从腐败的恢复自己的本地修改回购,加上他们和他们提交
  • push --force回到了自己的叉子,以便擦除/接一个能够被正确包装
+0

当你说克隆另一个分叉时,是否与克隆repo相同?当我尝试克隆回购时,出现上述错误。 并在第2步,恢复我的本地修改将只是在Git扩展中“重置文件更改”? 谢谢 – Anshul 2012-07-23 00:07:33

+0

@Anshul您的回购在Github上被多次复制(分叉)。尝试克隆这些其他回购之一,看看问题是否依然存在。 – VonC 2012-07-23 03:45:20

+0

我没有使用GitHub,这一切都在我的个人电脑上。所以如果我正确地理解了你的话,我应该拿一份我的其他软件仓库的副本,并使用它?从本质上讲,删除我的旧损坏的回购,并用新的克隆回购替换它?谢谢 – Anshul 2012-07-23 14:04:38

4

我搜索重置远程历史在这种非monolitic错误的信息,并发现此链接:http://git.661346.n2.nabble.com/Error-non-monotonic-index-after-failed-recursive-quot-sed-quot-command-td7575014.html

TL; DR:您删除非monolotic索引,然后重新索引它。在linux下这将是:

> rm .git/objects/pack/pack-29a18084cf61cd0322a6e9cfd485ce0977348c53.idx 
> git index-pack .git/objects/pack/pack-29a18084cf61cd0322a6e9cfd485ce0977348c53.pack 

此,我不得不运行一些git gc --prune=nowgit remote prune origin后,但我已经做了一些其他的操作之前,所以我可能会毁了我的回购协议。