Git: Как обработать коммит, чтобы версии файла существовали целиком (а не только как diff-файлы) - PullRequest
1 голос
/ 07 февраля 2012

Есть ли способ заставить Git хранить версии файла в виде полных и отдельных сущностей, в отличие от нижестоящих коммитов, существующих в виде различий от вышестоящих коммитов?

Некоторые спросят, почему я хочу это сделать. Я хочу сделать это, потому что мой начальник сказал мне об этом. FWIW, конкретный файл, о котором идет речь, является продуктом процесса, в котором одно небольшое изменение входных данных может привести к значительной реструктуризации файла.

Ответы [ 2 ]

7 голосов
/ 07 февраля 2012

Хранилище объектов Git уже делает это, и это не подлежит обсуждению.

База данных объектов Git ориентирована на снимок , отдельные файлы - blob с, а каталоги - tree объекты.

Проверьте это легко, посмотрев под .git/objects или выполнив

git rev-list --objects --all

Теперь, через некоторое время, для эффективности, база данных объектов будет «сжата» (так называемая упаковка). Это приводит к эффективности хранения, но не связано с ошибками sotring.


Фон

Хранение дельт было популяризировано RCS, CVS, Subversion и другими (SourceSafe?). Главным образом, потому что модель упростила перенос наборов изменений, потому что они уже были бы в дельта-форме. Современные VCS (в основном распределенные) эволюционировали от этого и сделали упор на целостность данных .

Целостность данных

Из-за структуры объектной базы данных, git очень устойчив и обнаружит любой поврежденный бит данных в любом месте снимка или всего репо. См. Этот пост для более подробной информации о криптографических свойствах Git-репозиториев: Linus talk - Git против повреждения данных?

В болтовне техно: истории коммитов образуют криптографически сильные деревья меркла. Когда сумма sha1 коммита tip (HEAD) совпадает, математически следует, что

  • содержимое дерева
  • история веток (включая все подписи и учетные данные коммиттера / автора)

идентичны. Это огромная функция безопасности git (и других SCM, которые используют эту функцию)

2 голосов
/ 07 февраля 2012

Git объекты хранятся как полные файлы. (За исключением случаев, когда вы gc делаете репо, а затем они оптимизируются - но это детали реализации). Если вы знаете git sha файла, вы можете получить его полностью:

git cat-file -p <sha>

, который выводит файл в зависимости от его типа.

Вы можете увидеть статью об этом на 365git - Git Objects: The Blog

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