Если у вас есть доступ к файловой системе к удаленному или любому другому неповрежденному хранилищу, содержащему этот объект , вы сможете пойти туда и запустить:
git cat-file tree af9ed8 > 9ed8...
Обратите внимание, что для этого требуется толькоДоступ к репо только для чтения (вы можете записать файл в другом месте), поэтому он должен быть очень безопасным, и вы даже можете сделать это как пользователь, у которого нет прав на запись в файловую систему.Затем вы можете перенести / скопировать его в соответствующее место в вашем репо:
cp path/to/9ed8... .git/objects/af/9ed8...
Свободные объекты хранятся в каталогах с первыми двумя цифрами хэша;имена файлов - остальная часть хеша.
Редактировать: если объект удален на удаленном конце, вы также можете просто скопировать его из .git/objects
, но если он упакован, вам придется распаковатьэто с git unpack-objects
, и я предполагаю, что упаковочные файлы в этом репо слишком велики.Самый лучший способ сделать это - скопировать файл в ваше поврежденное хранилище, удалить любые поврежденные объекты, а затем использовать git unpack-objects < packfile
, который не будет распаковывать уже существующие объекты.
Я не уверенкак это сделать с помощью обычных удаленных команд;даже нижний уровень git fetch-pack
по-прежнему работает на уровне ссылки, получая пачку с необходимыми коммитами для завершения ссылки.Я подозреваю, что вы могли бы сделать что-то хитрое, например, удалить все объекты коммитов, которые ссылаются на это дерево (git fsck
может помочь вам их найти).Я действительно надеялся, что вы сможете создать тег, указывающий на этот объект, отправить его на удаленный компьютер, а затем попытаться извлечь тег с удаленного устройства (уговаривая его извлечь объект), но похоже, что Git довольно осторожен, чтобы непозволяет создавать или манипулировать тегом, указывающим на несуществующий объект.