2012-07-22 3 views
5

У меня git Установки есть центральный репозиторий, на который я нажимаю. Сегодня я решил посмотреть центральное хранилище, используя Git Extensions, и он сказал, что у репо нет коммитов (почти как если бы репо не было создано). Исследуя этот вопрос, я попытался клонировать репозиторий, и он дал мне некоторые странные ошибки, я никогда не видел:Ошибка Git "немонотонный индекс"

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 относительно этого вопроса, но он остается без ответа (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 в хост-порядок байтов (что мало-пошло на процессорах Intel).

Функция ntohl возвращает значение, указанное в параметре netlong, с отменой порядка байтов. Если netlong уже находится в порядке байтов хоста, то эта функция изменит его. Это зависит от приложения, чтобы определить, должен ли порядок байтов быть отменен.

ntohl функция принимает 32-битное число в TCP/IP сетевой порядок байт (The AF_INET или AF_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

Когда вы говорите, что клонировать другую вилку, это то же самое, что клонирование репо? Я получаю эти выше ошибки, когда пытаюсь клонировать репо. И на шаге 2 для восстановления моих локальных модификаций было бы просто «Сбросить изменения файлов» в Git Extensions? Thanks – Anshul

+0

@Anshul Ваше репо было скопировано (раздвоено) несколько раз на Github. Попробуйте клонировать один из этих других репозиториев и посмотреть, сохраняется ли проблема. – VonC

+0

Я не использую GitHub, это все на моем персональном компьютере. Поэтому, если я правильно вас понимаю, я должен просто взять копию одного из моих других репозиториев и просто использовать это? По существу, удалите мое старое сломанное репо и замените его новым клонированным? Спасибо – Anshul

4

Я был поиск для получения информации об этом виде немонолитной ошибки и нашел эту ссылку: 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=now и git remote prune origin, но я сделал некоторые другие операции, прежде чем это я, возможно, испортил мой репозиторий.

Смежные вопросы