Git
英语 ▾ 主题 ▾ 最新版本 ▾ gitnamespaces 最后更新于 2.32.0

名称

gitnamespaces - Git 命名空间

概要

GIT_NAMESPACE=<namespace> git upload-pack
GIT_NAMESPACE=<namespace> git receive-pack

描述

Git 支持将单个仓库的引用划分为多个命名空间,每个命名空间都有自己的分支、标签和 HEAD。Git 可以将每个命名空间公开为独立的仓库进行拉取和推送,同时共享对象存储库,并将所有引用公开给 git-gc[1] 等操作。

将多个仓库存储为单个仓库的命名空间可以避免存储相同对象的重复副本,例如存储同一源代码的多个分支时。备用机制为避免重复提供了类似的支持,但备用机制不会阻止向没有持续维护的仓库添加的新对象之间的重复,而命名空间则可以阻止。

要指定命名空间,请将 GIT_NAMESPACE 环境变量设置为该命名空间。对于每个引用命名空间,Git 将在 refs/namespaces/ 下的目录中存储相应的引用。例如,GIT_NAMESPACE=foo 将在 refs/namespaces/foo/ 下存储引用。你也可以通过 git[1]--namespace 选项来指定命名空间。

请注意,包含 / 的命名空间将扩展为命名空间的层次结构;例如,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'

安全

拉取和推送协议并非旨在防止一方从另一方仓库窃取不应共享的数据。如果你有需要保护免受恶意对等攻击的私有数据,最佳选择是将其存储在另一个仓库中。这适用于客户端和服务器。特别是,服务器上的命名空间对于读取访问控制无效;你只应向那些你信任其读取整个仓库的客户端授予对命名空间的读取访问权限。

已知攻击向量如下

  1. 受害者发送 “have” 行,广告它拥有的对象的 ID,这些对象并非明确意图共享,但如果对等方也拥有这些对象,则可用于优化传输。攻击者选择要窃取的对象 ID X,并发送指向 X 的引用,但无需发送 X 的内容,因为受害者已经拥有它。现在,受害者认为攻击者拥有 X,并且它会在稍后将 X 的内容发送回攻击者。(此攻击对于客户端在服务器上执行最为直接,方法是在客户端可访问的命名空间中创建指向 X 的引用,然后获取它。服务器对客户端执行此操作的最可能方法是将 X “合并” 到公共分支,并希望用户在此分支上进行其他工作,并在不知不觉中将其推送回服务器。)

  2. 与 #1 一样,攻击者选择要窃取的对象 ID X。受害者发送攻击者已经拥有的对象 Y,攻击者虚假地声称拥有 X 而不拥有 Y,因此受害者将 Y 作为 X 的增量发送。增量向攻击者揭示了 X 中与 Y 相似的区域。

GIT

git[1] 套件的一部分

scroll-to-top