2015-02-23 5 views
1

У меня была проверка различий между моими текущими файлами и резервной копией файлов на моем внешнем диске, и я обнаружил некоторые различия между репозиторией git и ее резервной копией. Единственными отличиями были некоторые дополнительные файлы под .git/objects на левой стороне и две пустые .git/objects/info и .git/objects/pack папки справа. Я сделал быстрые git show и git log с обеих сторон, которые дали идентичные выходы.Git не может найти оборванное дерево.

Затем я сделал git fsck --no-reflogs и нашел еще одну дополнительную обвязку с левой стороны. Итерационно git ls-tree, используя мой путь, что дополнительный коммит дал мне кучу деревьев и капель, которые учитывали все, кроме одного из дополнительных файлов с левой стороны.

Используя git cat-file -t <sha1>, этот последний файл сказал мне, что это дерево. Тем не менее, я использовал git ls-tree на каждой фиксации и до сих пор не нашел ссылки на этот загадочный древовидный объект. Итак, откуда именно появился этот файл? Я 99.99% уверен, что это не имеет значения, просто любопытно: P

+0

Я действительно нашел довольно много git repo, которые следовали одному и тому же шаблону: дополнительные объекты на левой стороне, пустые/info и/pack папки с правой стороны. Я изменил клиентов Git, которые, как я предполагаю, вызвали все эти несоответствия. Тем не менее, мне все еще любопытно, где этот конкретный дополнительный файл поступает от – woojoo666

+0

Запуск 'diff' или что-то подобное против двух разных репозиториев, даже если они в настоящее время имеют то же самое состояние в отношении ветвей ветвей, пультов, локальных коммитов и рабочего каталога , никогда не будет надежным методом сравнения из-за, по крайней мере, упакованного/распакованного состояния объектов, частоты сборок сбора мусора, ошибок и нескольких других возможных причин ... – twalberg

+0

Интересно, я думаю, у меня будет немного почитать эти темы. Да, у меня было подозрение, что я слишком далеко опустился вниз по кроличьей норе, но это было относительно небольшое репо (4-5 коммитов), поэтому я подумал, что это будет хороший шанс увидеть, как реально работает git – woojoo666

ответ

1

meh, rookie error. Оказывается, добавочная болтливая фиксация указывала прямо на пропавшее дерево. Я думал, что выполнение git ls-tree <sha1> объекта commit даст дерево, на которое оно указывает, но на самом деле дает детям дерева, на которое оно указывает. Используя git cat-file -p <sha1>, который находит содержимое объекта, дал мне необходимую мне информацию.

Похоже, что все файлы в .git/objects либо совершают, либо обманывают. Я нашел this, чтобы стать отличным кратким справочником о том, как работают объекты git.

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