Разные версии файла получают свои собственные blob / sha? - PullRequest
10 голосов
/ 08 мая 2011

Если я правильно прочитал, git сохраняет все свои файлы в BLOB-объектах. Если вы изменяете файл, получает ли измененная версия файла свой собственный BLOB-объект и, следовательно, свой собственный sha?

Ответы [ 2 ]

6 голосов
/ 08 мая 2011

Это правильно - если содержимое файла изменяется даже на один бит, у него будет новое имя объекта (a.k.a. SHA1sum или hash). Вы можете увидеть имя объекта, которое файл будет иметь с git hash-object, если вы хотите проверить это:

 $ git hash-object text.txt
 9dbcaae0abd0d45c30bbb1a77410fb31aedda806

Подробнее о том, как вычисляются хэши для BLOB-объектов, можно узнать здесь:

5 голосов
/ 08 мая 2011

Я хотел бы добавить к ответу Марка.

В то время как Subversion, CVS и даже Mercurial используют Delta Storage - при этом они сохраняют только разницу между коммитами, Git делает снимок дерева с каждым коммитом.

Когда содержимое файла изменяется, новый объект добавляется для содержимого в хранилище объектов. На данный момент Git заботится только о содержимом, а не о имени файла. Имя файла и путь отслеживаются через объекты дерева. Когда файл изменяется и добавляется в индекс, создаются BLOB-объекты для содержимого. Когда вы фиксируете (или используете низкоуровневые команды, такие как git write-tree), объект дерева обновляется, чтобы файл указывал на новое содержимое. Также следует отметить, что хотя каждое изменение в файле создает для него новый BLOB-объект, но файлы с одинаковым содержимым никогда не получат разные BLOB-объекты.

Итак, ваш вопрос

Если вы изменяете файл, то изменяет версия файла получить свой собственный блоб и для чего это свой собственный ша?

Новый контент получает новый BLOB-объект, а файл указывает на новый BLOB-объект. А также, если новый контент такой же, как у какого-то предыдущего блоба, он просто указывает на старый.

PS: Следует отметить, что Git "упаковывает" эти "незакрепленные объекты" в файлы упаковок (где git хранит дельты из одной версии файла в другую), когда вокруг слишком много незакрепленных объектов, если git gc запускается вручную или при отправке на удаленный сервер, поэтому может быть так, что файлы хранятся в дельте. Посмотрите на главу Pro-Git об этом для получения дополнительной информации - http://progit.org/book/ch9-4.html

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