gitnamespaces
Имя
gitnamespaces — Набор пространств имён Git
Синтаксис
GIT_NAMESPACE=<namespace> git upload-pack GIT_NAMESPACE=<namespace> git receive-pack
Описание
Git поддерживает разделение ссылок (refs) одного репозитория на несколько пространств имён, каждое из которых имеет собственные ветви, теги и HEAD. Git может представить каждое пространство имён как независимый репозиторий для pull и push, при этом совмещая хранилище объектов и предоставляя доступ ко всем ссылкам для операций, таких как git-gc[1].
Хранение нескольких репозиториев в качестве пространств имён одного репозитория позволяет избежать хранения дубликатов одних и тех же объектов, например, при хранении нескольких ветвей одного исходного кода. Механизм alternates обеспечивает аналогичную поддержку для избежания дублирования, но alternates не предотвращает дублирование между новыми объектами, добавленными в репозитории, без постоянного обслуживания, в отличие от пространств имён.
Для указания пространства имён установите переменную среды GIT_NAMESPACE в нужное пространство имён. Для каждого пространства имён ссылок Git сохраняет соответствующие ссылки в каталоге под refs/namespaces/. Например, GIT_NAMESPACE=foo будет хранить ссылки под refs/namespaces/foo/. Вы также можете указать пространства имён с помощью параметра --namespace для команды git[1].
Обратите внимание, что пространства имён, включающие / , расширятся в иерархию пространств имён; например, GIT_NAMESPACE=foo/bar будет хранить ссылки под refs/namespaces/foo/refs/namespaces/bar/. Это позволяет путям в GIT_NAMESPACE вести себя иерархически, так что клонирование с GIT_NAMESPACE=foo/bar даёт тот же результат, что и клонирование с GIT_NAMESPACE=foo и последующее клонирование из этого репозитория с GIT_NAMESPACE=bar. Это также устраняет неоднозначность с необычными путями пространств имён, такими как foo/refs/heads/, которые в противном случае могли бы привести к конфликтам каталогов/файлов в каталоге refs.
git-upload-pack[1] и git-receive-pack[1] перезаписывают имена ссылок в соответствии с указаниями GIT_NAMESPACE. git-upload-pack и git-receive-pack будут игнорировать все ссылки, выходящие за пределы указанного пространства имён.
Умный HTTP-сервер git-http-backend[1] передаст GIT_NAMESPACE в программы-обработчики; см. git-http-backend[1] для примера конфигурации, чтобы предоставить пространства имён репозитория в качестве репозиториев.
Для простого локального тестирования можно использовать git-remote-ext[1]:
git clone ext::'git --namespace=foo %s /tmp/prefixed.git'
Безопасность
Протоколы fetch и push не предназначены для предотвращения кражи данных одной стороной из другого репозитория, которые не предполагалось разделять. Если у вас есть конфиденциальные данные, которые необходимо защитить от злонамеренного участника, лучше всего хранить их в другом репозитории. Это относится как к клиентам, так и к серверам. В частности, пространства имён на сервере неэффективны для управления доступом к чтению; вы должны предоставлять доступ к чтению к пространству имён только тем клиентам, которым вы доверяете с доступом к чтению ко всему репозиторию.
Известные векторы атаки следующие:
-
Жертва отправляет строки «have», рекламируя идентификаторы объектов, которыми она владеет, но которые не предназначены для совместного использования, но могут быть использованы для оптимизации передачи, если у участника также есть эти объекты. Злоумышленник выбирает идентификатор объекта X для кражи и отправляет ссылку на X, но не обязан отправлять содержимое X, потому что жертва уже владеет им. Теперь жертва считает, что у злоумышленника есть X, и впоследствии отправляет содержимое X злоумышленнику. (Эта атака наиболее проста для клиента, чтобы осуществить её на сервере, создав ссылку на X в пространстве имён, к которому у клиента есть доступ, а затем получив её. Наиболее вероятный способ для сервера осуществить её на клиенте — «слить» X в общедоступную ветвь и надеяться, что пользователь выполнит дополнительную работу над этой ветвью и отправит её обратно на сервер, не заметив слияния.)
-
Как и в #1, злоумышленник выбирает идентификатор объекта X для кражи. Жертва отправляет объект Y, которым злоумышленник уже владеет, а злоумышленник лживо заявляет, что владеет X и не владеет Y, поэтому жертва отправляет Y как разницу относительно X. Разница раскрывает злоумышленнику области сходства между X и Y.
gitnamespaces
© 2005–2026 Linus Torvalds and others
Licensed under the GNU General Public License version 2.
https://git-scm.com/docs/gitnamespaces