2012-07-22 77 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後,但我已經做了一些其他的操作之前,所以我可能會毀了我的回購協議。