Каковы разные версии формата репозитория (для параметра core.repositoryFormatVersion) в git?

Я заметил параметр по умолчанию в git core.repositoryFormatVersion, который по умолчанию равен 0, но что такое "версии формата репозитория" и какая функциональная разница они делают?

Ответы

Ответ 1

git 2.7 (ноябрь 2015) добавляет намного больше информации в новый Documentation/technical/repository-version.txt.
См. commit 067fbd4, commit 00a09d5 (23 июня 2015 г.) ) Джефф Кинг (peff).
(Слияние Junio ​​C Hamano - gitster - в совершить fa46579, 26 октября 2015 г.)

Теперь вы можете определить "расширения" и использовать core.repositoryformatversion как "маркер", чтобы сигнализировать о существовании указанных расширений, вместо того, чтобы набросать номер версии Git:

Если бы нам пришлось удалять версию репозитория для каждого такого изменения, то любая версия понимания понимания X также должна была бы понимать X-1, X-2 и т.д., несмотря на то, что несовместимость может быть в ортогональных частях системы, и в противном случае нет причин, по которым мы не можем реализовать один без другого (или, что более важно, то, что пользователь не может использовать одну функцию без другой, взвешивая компромисс в совместимости только для этой конкретной функции).

Этот патч документирует существующую стратегию repositoryformatversion и вводит новый формат "1" , который позволяет репозиторию указать, что он должен запускаться с произвольным набором расширений.

Выдержки из документа:

Каждый репозиторий Git помечен цифровой версией в core.repositoryformatversion в файле config. Эта версия определяет правила работы с данными репозитория на диске.

Обратите внимание, что это относится только к доступу к содержимому диска репозитория непосредственно.
Более старый клиент, который понимает только формат 0, все еще может подключаться через git:// к репозиторию с использованием формата 1, если процесс сервера понимает формат 1.

Версия 0

Это формат, определяемый исходной версией git, включая, но не ограничиваясь, формат каталога репозитория, файла конфигурации репозитория и хранилища объектов и ссылок.

Версия 1

Этот формат идентичен версии 0 со следующими исключениями:

  • При чтении переменной core.repositoryformatversion a git реализация, поддерживающая версию 1, ДОЛЖНА также читать любые  ключи конфигурации, найденные в разделе extensions файл конфигурации.

  • Если репозиторий версии-1 указывает любые клавиши extensions.*, которые  запуск Git не реализован, операция НЕ ДОЛЖНА  продолжить. Аналогично, если значение любого известного ключа не понято  по реализации, операция НЕ ДОЛЖНА продолжить.

Это можно использовать, например:

  • сообщить Git, что объекты не должны быть обрезаны на основе только по достижимости вершин (например, потому что это имеет детей "clone -shared" )

  • что ссылки хранятся в формате, помимо обычного каталоги ссылок "refs" и "pack-refs"

Теперь это действительно оригинальный подход ко всей политике версии версии версии и ее semver политика.

Поскольку мы получаем форматирование "1" , а потому, что формат "1" требует, чтобы работающий Git знал о любых упомянутых выше расширениях, мы знаем, что более старые версии кода не будут делать что-то опасное, когда сталкиваются с этими новыми форматами.

Например, если пользователь решает использовать хранилище баз данных для ссылок refs, они могут установить конфигурацию "extensions.refbackend" в "db".
Старые версии Git не будут понимать формат "1" и залог.
Версии Git, которые понимают "1" , но не знают о "refbackend" или знают о "refbackend", но не о бэкэнде "db", откажутся от запуска.
Это, конечно, раздражает, но гораздо лучше, чем альтернатива утверждению, что в репозитории нет ссылок в репозитории или записи в место, которое другие реализации не будут читать.

Обратите внимание, что мы определяем правила для формата 1 здесь. Мы никогда не пишем формат 1; это инструмент, предназначенный для использования пользователями и будущими расширениями для обеспечения безопасности со старыми реализациями.


В качестве первого расширения вы будете иметь Git 2.7 preciousObjects:

Если это расширение используется в репозитории, то не должно выполняться никаких операций, которые могут отбрасывать объекты из хранилища объектов. Это может быть полезно, если вы делите это хранилище с другими репозиториями, чьи ссылки вы не видите.

В документе упоминаются:

Если для ключа конфигурации extensions.preciousObjects установлено значение true, объекты в репозитории НЕ ДОЛЖНЫ удаляться (например, git-prune или git repack -d).

То есть:

Например, если вы выполните:

$ git clone -s parent child
$ git -C parent config extensions.preciousObjects true
$ git -C parent config core.repositoryformatversion 1

теперь у вас есть дополнительная безопасность при запуске Git в родительском репозитории.
Черновики и репаки заручится ошибкой, а git gc пропустит эти операции (она будет продолжать упаковывать ссылки и выполнять другие операции без объекта).
Старые версии git, выполняемые в репозитории, будут сбой при каждой операции.

Обратите внимание, что мы не устанавливаем расширение preciousObjects по умолчанию при выполнении "clone -s", так как это нарушает обратную совместимость. Это решение, которое пользователь должен сделать явно.


Обратите внимание, что этот бизнес core.repositoryformatversion устарел. Действительно старый. совершить ab9cb76, ноябрь 2005 г., Git 0.99.9l.
Это было сделанное первоначально для версии db:

Это означает, что версия репозитория init-db известна.

Он проверяет, говорит ли существующий файл конфигурации, что реализованный репозиторий имеет неправильную версию и прерван, прежде чем наносить дополнительный вред.

Ответ 2

Это для будущей совместимости - если разработчикам git когда-либо понадобится изменить способ сохранения репозиториев на диске, чтобы включить некоторые новые функции, тогда они могут сделать обновленные репозитории core.repositoryformatversion 1, Тогда более новые версии git, которые знают об этом новом формате, будут запускать код для работы с ним, а более старые версии git, которые не будут изящно ошибочны с помощью "Expected git repo version <= 0, found 1. Please upgrade Git".

В настоящее время единственной версией формата репо, определенной или распознанной, является 0, которая обозначает формат, который использовал любой публичный выпуск git.