2009-04-23 1 views
1

Я пытаюсь понять, как работает Git лучше.Как GIT решает, что происходит в блобе?

Учитывая некоторые произвольные файлы и некоторое количество коммитов, как git принимает решение о том, как разбить эти файлы на капли, которые затем однозначно идентифицируются с помощью хэшей SHA-1?

Я только что сделал около 10 коммитов perl/C/java кода и текста в новый git repo и как-то git разделил файлы на маленькие сегменты, как он определил, как эти сегменты должны быть разделены?

ответ

7

Git создает blob для содержимого каждого файла, если только тот же контент уже существует (в этом случае он повторно использует blob). Но есть еще - git также создает объекты для каждого каталога, фиксации и подписанного тега. Каждый объект хранится в .git/objects, пока репозиторий не будет повторно упакован (автоматически или запущен git gc), и в этом случае некоторые из объектов будут объединены и дефинированы в файл packfile (в .git/objects/pack).

Он не разбивает содержимое одного файла среди нескольких блоков или маленьких сегментов, как вы, кажется, думаете.

+0

Хорошо, спасибо за первую часть, помогает, в последнем пункте, я думаю, что меня смущает, что просмотр определенного файла с помощью GiTK File Viewer Git, похоже, знает, появились части нового объединенного файла, вот где я получил «сегменты», как Git делает определение и откуда взялись эти сегменты и как он узнает, что, например, часто повторяющаяся строка типа «make» является частью уникальной сегмент, а не повторное изменение его собственного права? –

+0

Я не уверен, что вы имеете в виду. Если вы имеете в виду различия, которые он показывает по сравнению с последней версией, это называется «diff» и рассчитывается «на лету» путем сравнения двух файлов. Если вы имеете в виду вид вины в git gui, это делается с помощью некоторого умного алгоритма вины, см. «Git blame» в командной строке. Он работает примерно так же, как и diff, но выполняется для каждой ревизии, а также берет удаленные строки из других файлов. – Pieter

+0

ОК, спасибо, я думаю, что теперь я понял, что смущало меня от других уступащих SCM (SVN/CVS/perforce), так это то, что они обычно не могут автоматически отличаться от старых версий, которые существовали в разных именованных файлах в разных каталогах, если только ветвление не было было сделано явно, что я не делал с Гит в этом случае. Итак, теперь я понимаю, что это две отдельные проблемы, как работает «умный» алгоритм diff/вины и как код хранится в блоках. Я отмечаю ваш ответ, не стесняйтесь добавлять детали, если что-то еще приходит на ум для нас Git newbies ... Спасибо –

1

Все файлы попадают в блокнот, но это не обязательно означает, что Git будет хранить файл в блобе (Git имеет высокоэффективный упакованный формат, который объединяет материал). Если вас интересует внутренняя часть формата упаковки Git, вам лучше спросить их список или прочитать их архитектурную документацию.

+0

ОК, я читал документы, но я стараюсь ускорить процесс обучения для меня и следующего человека на SO, я не смог ответить на этот вопрос, читая документы до сих пор. Хороший совет по поводу запроса в списке, я сделаю это, если ничего не придет сюда. –

+0

Это лучшее, что я мог найти, http://eagain.net/articles/git-for-computer-scientists/, но на самом деле он не отвечает на вопрос. –

+0

Список рассылки - это действительно единственный ресурс, который вы должны использовать для этого конкретного вопроса. (Или вы можете прочитать исходный код) – Arafangion

3

Я предлагаю вам проверить некоторые базовые (то есть «низкие уровни») ссылки. По вашему конкретному вопросу см. Раздел о Git Object Model в Книге сообщества Git.

После этого вам может быть интересно ознакомиться с Git from the Bottom Up (PDF) или отличным Git Internals (PDF, US$9) для понимания низкоуровневых подписями Git («контент-адресуемая файловая система» и ориентированные отношения ациклического графа).

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