Git: получить конкретный объект с удаленного - PullRequest
7 голосов
/ 31 января 2012

На работе нам приходится иметь дело с очень огромным git-репозиторием (90Go). После попытки настроить некоторые вещи в моей локальной копии (у меня были ошибки с файлом пакета, я пытался распаковать его), я мог удалить некоторые объектные файлы. Например:

> git gc

ошибка: не удалось прочитать af9ed8 [: snip:]

смертельно: плохой объект дерева af9ed8 [: snip:]

ошибка: не удалось запустить repack

Как я могу получить конкретный объект (в этом случае объект с хешем af9ed8 ...) из удаленного хранилища?

1 Ответ

4 голосов
/ 31 января 2012

Если у вас есть доступ к файловой системе к удаленному или любому другому неповрежденному хранилищу, содержащему этот объект , вы сможете пойти туда и запустить:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...