Git 错误“非单调索引”

问题描述 投票:0回答:3

我的

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

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

我已经在 Google 上搜索过这个问题,StackOverlow 上还有另一个关于这个问题的问题,但仍未得到解答(这个问题)。有人能够阐明这个问题吗?谢谢

git git-extensions
3个回答
9
投票

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

TL;DR:删除非单调索引,然后重新索引它。在 Linux 中它将是:

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

在此之后我必须运行一些

git gc --prune=now
git remote prune origin
,但我之前做过一些其他操作,所以我可能破坏了我的回购协议。


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;
}

ntohl
功能是:

ntohl 函数将

u_long
从 TCP/IP 网络顺序转换为主机字节顺序(在 Intel 处理器上为小端)。

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

ntohl
函数采用 TCP/IP 网络字节顺序(
AF_INET
AF_INET6
地址族)获取 32 位数字,并返回主机字节顺序的 32 位数字。

它的调用者:

在SO问题“git二进制差异算法(增量存储)是否标准化?”中查看包文件的结构:

pack file structure

第一个也由

builtin/fsck.c
调用,因此您可以尝试 git fsck --full --progress,以检查您的包文件是否有 local 损坏,或者是否确实存在远程仓库问题。
确保您可以在不同操作系统和/或不同版本的 Git 上复制该问题。

对于似乎在 GitHub 上分叉的(此处为“Netduino”)存储库,通常的解决方法是:

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

0
投票

另一个原因:在MasOS上,如果你想在移动磁盘上进行git克隆,则必须将其格式化为APFS。

© www.soinside.com 2019 - 2024. All rights reserved.