Git错误"非单调索引"

Ans*_*hul 9 git git-extensions

我的git设置有一个我推送的中央存储库.今天我决定查看中央存储库使用Git Extensions,它说repo没有提交(几乎就像回购从未创建过).调查这个问题,我试图克隆回购,它给了我一些我从未见过的奇怪错误:

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
Run Code Online (Sandbox Code Playgroud)

我已经在谷歌搜索过这个问题了,关于这个问题还有另外一个关于StackOverlow的问题,但是仍然没有答案(这个问题).有谁能够解释这个问题?谢谢

Bre*_*nes 7

我正在寻找这种非单一错误的信息并找到了这个链接:http://git.661346.n2.nabble.com/Error-non-monotonic-index-after-failed-recursive-quot-sed- QUOT-命令td7575014.html

TL; DR:你删除非monolotic索引,然后重新索引它.在linux中它将是:

> rm .git/objects/pack/pack-29a18084cf61cd0322a6e9cfd485ce0977348c53.idx
> git index-pack .git/objects/pack/pack-29a18084cf61cd0322a6e9cfd485ce0977348c53.pack 
Run Code Online (Sandbox Code Playgroud)

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


Von*_*onC 5

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

该错误消息来自sha1_file.c,方法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;
}
Run Code Online (Sandbox Code Playgroud)

ntohl函数为:

ntohl函数将u_longTCP/IP网络顺序转换为主机字节顺序(在Intel处理器上为little-endian).

ntohl函数返回netlong参数中提供的值,并反转字节顺序.如果netlong已经是主机字节顺序,那么此函数将反转它.由应用程序决定是否必须反转字节顺序.

所述ntohl函数接受TCP/IP网络字节顺序(一个32位数字AF_INETAF_INET6地址族),并在主机字节顺序返回一个32位的数字.

它被称为:

请参阅SO问题" 是否标准化git二进制差异算法(增量存储)? " 中的包文件结构:

包文件结构

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

通常的解决方法,对于一个(这里是"Netduino")回购,似乎是在GitHub上分叉,是:

  • 克隆另一个叉子,
  • 从损坏的仓库恢复自己的本地修改,添加它们并提交它们
  • push --force 回到自己的分叉,以便删除/重置远程历史记录,可以正确打包