Как исправить репозиторий 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.
Ответы
Ответ 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
, поскольку он обновляет только ссылки и не должен извлекать какие-либо объекты.