我有一台运行 gitolite 的机器,它既用于代码仓库,也用于 Sparkleshare。问题是 Sparkleshare 创建了它自己的密钥对。该密钥对首先进行身份验证,并且对代码仓库没有权限,因此 gitolite 终止而不尝试任何其他对。
我在想我可能需要弄清楚如何告诉 Sparkleshare 使用我的原始密钥,或者编写一个强制 gitolite 使用正确私钥的别名——我不确定这是否可能。
从未使用过SparkleShare,我不太确定它的要求,但我阅读了一些文档以尝试了解它如何与 Git 交互。看起来它旨在通过 Git 存储库发布和提取数据(它描述了使用“您自己的服务器”、Github 和 Gitorious 进行数据存储/传输/同步/其他)。
在下文中,我假设您希望通过相同的 Gitolite 安装同时为 SparkleShare 存储库和其他非 SparkleShare 存储库提供服务(以便您可以使用 Gitolite 来控制对这两种存储库的访问)。
在我看来,如果您遵循 Gitolite 提供访问权限的规则而不是 SparkeShare 的“使用您自己的服务器”文档中描述的通用“Git over SSH”,那么它可能与 Gitolite 托管的存储库一起工作得很好。
特别是不要使用ssh-copy-id
,或cat keyfile >> .ssh/authorized_keys
将公钥安装到 Gitolite 用户的.ssh/authorized_keys
. 这有效地为这些公钥的所有者提供了对 Gitolite 安装的“管理访问权”(例如,能够完全删除 Gitolite 安装和存储在该帐户下的任何其他内容)。相反,您应该通过 Gitolite 添加用户以授予新 SparkeShare 用户访问 Gitolite 托管存储库的权限(在您的gitolite_admin
克隆中进行并推送更改:将用户的公钥放入keydir/newusername.pub
并添加newusername
到存储库的访问列表中conf/gitolite.conf
)。如果您认为这是可行的方法,您甚至可以将多个 SSH 密钥与单个 Gitolite 用户关联。
如果您发现您绝对必须在同一个帐户中同时拥有具有“完全访问”密钥(否command=
)和 Gitolite 管理的密钥(带有 的密钥command=
,通过keydir/
Gitolite 管理存储库中管理的密钥)的用户.ssh/authorized_keys
,那么您可能会发现您可以强制ssh客户端通过IdentitiesOnly
参数仅提供某些指定的密钥(请参阅ssh_config(5))。
假设您可以通过 Git URL 访问 Gitolite git@server.example.com:projectA.git
,然后像这样配置每个客户端:
Host sparkleshare
User git
HostName server.example.com
IdentityFile ~/sparkelshare/pub_key
IdentitiesOnly yes
Host gitolite
User git
HostName server.example.com
IdentityFile ~/.ssh/id_rsa # or the user's normal, non-SparkleShare key
IdentitiesOnly yes
在 SparkleShare 中,将“我自己的服务器”设置为sparkleshare
(或者git@sparkleshare
如果它需要用户部分)并将“文件夹名称”设置为our-sparkleshare.git
(无论存储库的“Gitolite 路径”是什么,而不是“完整的服务器站点路径”,因为访问将通过 Gitolite 并且它期望相对于其 REPO_BASE 设置的路径)。
对于非 SparkleShare 访问,请使用 Git URL,例如gitolite:projectA.git