15

我正在使用 git 来管理一个小项目。我一直在通过 SSH 执行所有事务(克隆、推送、拉取等),但最近运行了 git-update-server-info,因为我想尝试通过 http 运行 git-clone。效果很好。凉爽的。现在我意识到任何人都可以通过 http 克隆我的存储库而无需任何凭据。我隐约知道通过 gitosis 设置 http 身份验证,但这真的不是我想要的。我宁愿完全禁用http克隆。

有没有办法告诉 git 只允许通过 ssh 进行交易?或者我可以撤消我在运行 git-update-server-info 以首先启用通过 http 进行克隆时所做的操作吗?

4

3 回答 3

17

要使 git 存储库通过 HTTP 传输可用,它需要由(任何)Web 服务器“导出”。如果您的存储库(更准确地说是它的.git目录)在 Web 浏览器中从外部可见,则可以通过 HTTP 协议匿名克隆或获取它。 git update-server-info用于为克隆(或获取)生成额外的辅助帮助信息(.git/objects/info/packs.git/info/refs)以了解可用的内容。

因此,您需要做的是删除这两个文件 (.git/objects/info/packs.git/info/refs),或者只是使您的存储库无法通过 Web 访问,可能是通过更改权限以使 Web 服务器运行为的用户(通常是 'nobody' 或“www”或“apache”)无权访问.git存储库。或者配置 Web 服务器,使其不导出(显示)您的存储库。

HTTP 协议(​​当前)是所谓的“哑”协议,这意味着它按原样提供文件,并且访问控制由 [哑] 服务器完成,在这种情况下由您使用的 Web 服务器(或文件系统)完成。

我猜您的存储库不是由 Web 服务器导出的,因此您无需担心:您的存储库无法通过 HTTP 使用

请注意,Git 存储库通常具有匿名未经身份验证的只读访问权限,并且仅在写入存储库时需要身份验证,即推送(至少对于开源项目)

于 2009-08-28T18:29:09.887 回答
6

有没有办法告诉 git 只允许通过 ssh 进行交易?

6 到 8后,Git 2.12(2017 年第一季度)将提出一个配置来允许或禁用 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 ( )的commit abcbdc0(2016 年 12 月 14 日) 。 请参阅布兰登·威廉姆斯 (Brandon Williams ) 的提交 a768a02提交 aaeae4db提交 f1762d7提交 f962ddf提交 85e4205(2016 年 12 月 14 日(由Junio C Hamano 合并——提交 9d540e9中,2016 年 12 月 27 日)peff
mbrandonw
gitster

这允许通过新的配置机制启用克隆/获取/推送期间允许传输哪些协议的更细粒度的控制。

git config现在包括:

protocol.allow

如果设置,则为所有没有明确具有策略 ( protocol.<name>.allow) 的协议提供用户定义的默认策略。
默认情况下,如果未设置,

  • 已知安全协议(http、https、git、ssh、文件)的默认策略为always,
  • 已知危险协议 (ext) 的默认策略为never, 和
  • 所有其他协议的默认策略为user.

支持的政策:

  • always- 协议总是可以使用的。
  • never- 协议永远无法使用。
  • user- 协议只能在GIT_PROTOCOL_FROM_USER未设置或值为 1
    时使用。当您希望协议可供用户直接使用但不希望执行克隆/获取的命令使用它时,应使用此策略/push 无需用户输入的命令,例如递归子模块初始化。
于 2016-12-28T21:02:46.593 回答
1

删除.git/objects/info/packs.git/info/refs

于 2009-08-28T18:22:30.850 回答