我正在使用 git 来管理一个小项目。我一直通过 SSH 执行所有事务(克隆、推送、拉取等),但最近运行了 git-update-server-info,因为我想尝试通过 http 运行 git-clone。效果很好。凉爽的。现在我意识到任何人都可以通过 http 克隆我的存储库而无需任何凭据。我隐约知道通过 gitosis 设置 http 身份验证,但这确实不是我想要的。我宁愿完全禁用 http 克隆。
有没有办法告诉 git 只允许通过 ssh 进行事务?或者我可以撤消当我运行 git-update-server-info 以启用通过 http 的克隆时所做的事情吗?
要通过 HTTP 传输使用 git 存储库,它需要由(任何)Web 服务器“导出”。如果您的存储库(更准确地说是其
.git
目录)在 Web 浏览器中从外部可见,则可以通过 HTTP 协议匿名克隆或获取它。 git update-server-info
用于生成额外的辅助辅助信息(.git/objects/info/packs
和 .git/info/refs
),以便克隆(或获取)以了解可用的内容。
因此,您需要做的是删除这两个文件(
.git/objects/info/packs
和.git/info/refs
),或者只是使您的存储库无法通过网络访问,也许通过以用户的方式更改权限哪个 Web 服务器运行(通常为“nobody”或“www”或“apache”)无权访问 .git
存储库。或者配置网络服务器,这样它就不会导出(使其可见)您的存储库。
HTTP 协议(目前)被称为“哑”协议,这意味着它按原样提供文件,并且访问控制由[哑]服务器完成,在本例中由您使用的 Web 服务器(或文件系统)完成。
我猜你的存储库不是由网络服务器导出的,所以你不用担心:你的存储库无法通过 HTTP 访问。
请注意,Git 存储库通常具有未经身份验证的匿名只读访问权限,并且仅在写入存储库时需要身份验证,即推送(至少对于开源项目)
有没有办法告诉 git 只允许通过 ssh 进行交易?
6 到 8 年之后,Git 2.12(2017 年第 1 季度)将提出一项配置以允许或禁用 Git 使用的协议。
git config protocol.http.allow never
git config protocol.https.allow never
git config protocol.git.allow never
git config protocol.file.allow never
git config protocol.ssh.allow always
请参阅 Jeff King (peff
)
的commit abcbdc0(2016 年 12 月 14 日)。
mbrandonw
)。gitster
-- 合并于 commit 9d540e9,2016 年 12 月 27 日)
这允许在通过新配置启用克隆/获取/推送期间允许传输的协议进行更细粒度的控制 机制。
git config
现在包括:
protocol.allow
如果设置,则为所有未明确具有策略的协议提供用户定义的默认策略 (
)。protocol.<name>.allow
默认情况下,如果未设置,
- 已知安全协议(http、https、git、ssh、file)的默认策略为
,always
- 已知危险协议 (ext) 的默认策略为
,并且never
- 所有其他协议都有默认策略
。user
支持政策:
- 协议始终可以使用。always
- 协议永远无法使用。never
- 仅当user
未设置或值为 1 时才能使用协议。GIT_PROTOCOL_FROM_USER
当您希望用户可以直接使用协议但不希望它被无需用户输入而执行克隆/获取/推送命令的命令使用时,应使用此策略,例如递归子模块初始化。
删除
.git/objects/info/packs
和 .git/info/refs