10

我的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 上还有另一个关于这个问题的问题,但仍然没有答案(这个问题)。任何人都能够阐明这个问题?谢谢

4

2 回答 2

8

我在这种非单调错误中搜索信息并找到了这个链接: http: //git.661346.n2.nabble.com/Error-non-monotonic-index-after-failed-recursive-quot-sed- quot-command-td7575014.html

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

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

在这之后我不得不运行一些git gc --prune=nowand git remote prune origin,但我之前做过一些其他的操作,所以我可能已经破坏了我的 repo。

于 2015-06-08T09:40:05.947 回答
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_longTCP/IP 网络顺序转换为主机字节顺序(在 Intel 处理器上是 little-endian)。

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

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

它由以下方式调用:

在 SO 问题“ Is the git binary diff algorithm(delta storage)是否标准化? ”中查看包文件的结构:

打包文件结构

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

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

  • 克隆另一个叉子,
  • 从损坏的仓库中恢复自己的本地修改,添加它们并提交它们
  • push --force回到自己的fork,以便通过一个可以正确打包的方式擦除/重置远程历史
于 2012-07-22T07:13:27.380 回答