Ответ 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
известна.Он проверяет, говорит ли существующий файл конфигурации, что реализованный репозиторий имеет неправильную версию и прерван, прежде чем наносить дополнительный вред.