2016-03-14 2 views
2

Я играл с GIT внутренностей, и заметил, что дерево объектов может магазин совершить объекты, используя LS-дерево/mktree формат:Как git GC фиксирует объекты внутри дерева?

0160000 commit <sha1> name 

мне интересно, как придурок GC обрабатывает такие ситуация.

source code относится к этому как directory link, так как нормально недействительному режим битовой 0160000 случается комбинация каталогов и ссылок битмаски, и gitlink, поскольку он

является ссылкой на другой каталог мерзавца.

Оглядевшись, я могу видеть, что поведение подмодуля построено на этом (в паре с .gitmodules файлом, чтобы знать, где другой каталог мерзавца есть), но будет мерзавец заслонки на него, если он нашел в дикой природе, в некоторых в другом контексте? Что делать, если коммит был локальным коммитами в базе данных объектов git? Если бы это была единственная ссылка на фиксацию, которая бы зафиксировала не GC'd, или GC не считает это ссылкой, поскольку предполагает, что она является внешней?

+2

Это относится к фиксации в * подмодуль *, а не фиксации в текущем * * хранилище. – o11c

+0

Да, я думал, что, поскольку деревья * могут * указывать на фиксацию того, что GC может распознать ссылки, не связанные с субмодулем, на ссылки на sha1s внутри репо в качестве ссылок на зависание. Кажется, нет. –

ответ

1

Оказалось, что поведение этого не является тонким - имитирует его сам, и фиксация действительно подбирается для GC.

Демонстрация:

git init test && cd test 

blob=$(echo "foobar" | git hash-object -w --stdin) 
tree=$(echo "100644 blob $blob\tblob" | git mktree) 
commit=$(git commit-tree $tree -m "Made sample commit.") 

git prune -n # Should show the sha1's for the above objects since no ref points to them 

tree_with_commit=$(echo "0160000 commit $commit\tlocal-commit" | git mktree) 
git tag commit-tree $tree_with_commit # To register our objects with a ref and avoid GC 

git prune -n # Same objects are up for GC––the tree_with_commit reference won't preserve them 
+0

Нужно добавить '-e', как в' tree = $ (echo -e "100644 blob $ blob \ tblob" | git mktree) '- см. Http://stackoverflow.com/a/27283328/281545 –

+0

Не могли бы вы объяснить что 'tree = $ (echo" 100644 blob $ blob \ tblob "| git mktree)' делает? –

+1

@Mr_and_Mrs_D 'git mktree' позволяет создать новый объект дерева, предоставив ему строку для каждого объекта, который вы хотите добавить в дерево. Формат каждой строки должен быть «file_permissions object_type object_sha1 \ t name_in_tree». Он возвращает sha1 созданного объекта дерева. В этом случае я просто беру наш ранее созданный blob, чей sha1 хранится в '$ blob' и добавляет его как read/writeable blob к новому дереву под именем' blob'. –

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