Подтвердить что ты не робот

Как исправить репозиторий git, сломанный прерыванием git fetch?

Если git fetch прерывается, например, с помощью Ctrl-C или вызвано проблемами подключения, после этого git fetch, а также git pull не работают.

[email protected]:~/code/openttd-git$ git fetch
^C
[email protected]:~/code/openttd-git$ git fetch
error: Unable to find 22d90742fc79a9011fb86ee03d8aeea66bc12657 under http://git.openttd.org/openttd/trunk.git
Cannot obtain needed object 22d90742fc79a9011fb86ee03d8aeea66bc12657
error: Fetch failed.

Я считаю, что это не связано с репозиторием. Использование git clone для создания копии этого сломанного локального репозитория в новом локальном репозитории не устраняет это. Единственное, что я знаю до сих пор, - это git clone весь удаленный репозиторий (origin/master) в новый локальный репозиторий. Но есть ли лучшее (более быстрое) решение?

Отчет об ошибках Debian, который содержит последнее сообщение с февраля 2011 года. Является ли это той же ошибкой, что у меня есть или есть уже исправление или любое решение или обходной путь к этому? Моя версия git - 1.7.10.

4b9b3361

Ответ 1

найдите *.pack.temp в .git/objects/pack в вашем локальном репозитории. Затем найдите файл .idx с тем же базовым именем и переместите оба из них (или удалите их, но лучше быть в безопасности, чем извините). Rerun git fetch, и он должен работать (ну, это было для меня).

Например:

% git fetch
error: Unable to find a4fb0b54b2609df8a1ee4b97c268d205fc5bf9f1 under https://www.example.com/~someuser/something.git
Cannot obtain needed object a4fb0b54b2609df8a1ee4b97c268d205fc5bf9f1
error: fetch failed.

% ls -l .git/objects/pack
total 65872
-rw-r--r-- 1 someuser someuser    64072 Feb 12  2014 pack-2e31e66e67d8596f1193bbbc06c87293900c6e45.idx
-rw-r--r-- 1 someuser someuser    16920 Jul 21  2013 pack-3d76e0bf6c67d71913efc0711d56f04c7f79b95d.idx
-rw-r--r-- 1 someuser someuser    62224 Feb 11  2014 pack-74107fa80989df6619479874d94b5f8ed010fd2f.idx
-rw-r--r-- 1 someuser someuser    96552 Oct 30 22:55 pack-bb75633331ea0e74d4d3cb29f7660e1ba00fb899.idx
-rw-r--r-- 1 someuser someuser    73228 Mar  6  2014 pack-de0c1bcf3550cd7a2fd0c5a981bc17d15f1144c0.idx
-r--r--r-- 1 someuser someuser   129144 Feb  2 18:57 pack-ffb25d036dea040923468e2de07023f9b497aeb7.idx
-r--r--r-- 1 someuser someuser 46413554 Feb  2 18:57 pack-ffb25d036dea040923468e2de07023f9b497aeb7.pack
-r--r--r-- 1 someuser someuser   129312 Feb  2 19:10 pack-ffbdfa2c676aaf392ea722cb68eaa87e45af092c.idx
-rw-r--r-- 1 someuser someuser 20450545 Feb  2 19:09 pack-ffbdfa2c676aaf392ea722cb68eaa87e45af092c.pack
-rw-r--r-- 1 someuser someuser   129312 Feb  2 18:36 pack-ffbdfa2c676aaf392ea722cb68eaa87e45af092c.idx
-rw-r--r-- 1 someuser someuser  9863168 Feb  2 18:37 pack-ffbdfa2c676aaf392ea722cb68eaa87e45af092c.pack.temp

% mv .git/objects/pack/pack-ffbdfa2c676aaf392ea722cb68eaa87e45af092c.idx /tmp/
% mv .git/objects/pack/pack-ffbdfa2c676aaf392ea722cb68eaa87e45af092c.pack.temp /tmp/
% git fetch
From https://www.example.com/~someuser/something
   3288ab9..a4fb0b5  master     -> origin/master

Ответ 2

Попробуйте выполнить следующие команды:

git fsck
git gc

Ответ 3

man git-fsck

говорит использовать rsync:

Любые поврежденные объекты, которые вам нужно найти в резервных копиях или других архивах (т.е. вы можете просто удалить их и        выполните rsync с другим сайтом в надежде, что у кого-то есть объект, который вы испортили).

rsync -av [email protected]:repo/.git ./.git

работал у меня

Ответ 4

Вы можете запустить:

git reset --hard <some prior commit>

В теории, если вы только что запустили git fetch, вы должны иметь возможность:

git reset --hard HEAD

Это должно отменить изменения, вызванные прерванной операцией извлечения, возвращая ваш репозиторий в предыдущее состояние. На этом этапе вы сможете повторить операцию fetch.

Ответ 5

Вы пробовали очистить репо?

git gc

Будьте предупреждены, так как вышеупомянутая команда также очищает файлы reflog.

Ответ 6

Вероятно, репозиторий поврежден. Запуск git fsck и git gc на сервере может решить проблему. Клонирование в отдельный каталог и извлечение из этого каталога также даст вам коммиты. После этого будет работать git fetch, поскольку он обновляет только ссылки и не должен извлекать какие-либо объекты.