Git не может найти свисающее дерево
Я запустил проверку разницы между моими текущими файлами и резервной копией файлов на моем внешнем диске, и я обнаружил некоторые различия между git-репо и его резервной копией. Единственными отличиями были некоторые дополнительные файлы в.git/objects с левой стороны и две пустые папки.git/objects/info и.git/objects/pack справа. Я сделал быстрый git show
а также git log
с обеих сторон, что дало одинаковые выходы.
Тогда я сделал git fsck --no-reflogs
и обнаружил еще один висячий коммит на левой стороне. Итеративно git ls-tree
В ходе этого дополнительного коммита я получил кучу деревьев и пятен, которые составляли все, кроме одного, из дополнительных файлов на левой стороне.
С помощью git cat-file -t <sha1>
в этом последнем файле сказано, что это дерево. Тем не менее, я использовал git ls-tree
на каждом коммите и до сих пор не нашел ссылки на этот таинственный объект дерева. Так откуда же этот файл? Я на 99,99% уверен, что это не имеет значения, просто любопытно:P
1 ответ
Мех, новичок ошибка. Оказывается, дополнительный висячий коммит указывал прямо на отсутствующее дерево. Я думал что делаю git ls-tree <sha1>
на коммите объект дал бы дерево, на которое он указывал, но на самом деле он дает потомкам дерева, на которое он указывает. С помощью git cat-file -p <sha1>
, который находит содержимое объекта, дал мне необходимую информацию.
Похоже, что все файлы в.git/objects являются коммитами или висячими коммитами. Я обнаружил, что это отличное краткое руководство по работе с git-объектами.