Gitolite:添加用户无法正常工作,以及使用root克隆时被fallthru拒绝?

6
我已经在我的NAS上初始化了一个空的git仓库,并尝试通过生成新的公钥"foo.pub"并将其复制粘贴到keydir/中,然后提交并推送到NAS来添加一个新用户。
首先是文件:
这是我的~/.ssh/config文件:
Host root
    HostName iptonas
    User root
    Port 123        

Host foo
    HostName iptonas
    User foo
    Port 123
    identityfile ~/.ssh/foo

从NAS上拷贝了gitolite-admin的副本:
git clone ssh://root/gitolite-admin

我得到:

Cloning into 'gitolite-admin'...
remote: Counting objects: 12, done.
remote: Compressing objects: 100% (9/9), done.
remote: Total 12 (delta 1), reused 0 (delta 0)
Receiving objects: 100% (12/12), done.
Resolving deltas: 100% (1/1), done.

这是我的gitolite.conf文件:

repo gitolite-admin
    RW+     =   git

repo testing
    RW+     =   @all

repo newrepo
    RW+     =   foo
    RW+     =   bar

当我使用以下命令推送我的gitolite-admin副本时:

git push root:gitolite-admin

我得到:

Counting objects: 10, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (5/5), done.
Writing objects: 100% (6/6), 1.02 KiB, done.
Total 6 (delta 0), reused 0 (delta 0)
remote: Initialized empty Git repository in /root/repositories/newrepo.git/
To root:gitolite-admin
   897113c..e7e2daf  master -> master

现在,当我尝试推送到新的仓库时

当我尝试运行以下命令时:

git clone foo:newrepo

I get:

Cloning into 'newrepo'...
foo@iptonas's password: 
fatal: 'newrepo' does not appear to be a git repository
fatal: The remote end hung up unexpectedly

当我尝试运行时:

git clone root:newrepo

I get:

Cloning into 'newrepo'...
FATAL: R any newrepo git DENIED by fallthru
(or you mis-spelled the reponame)
fatal: The remote end hung up unexpectedly

我不确定我做错了什么?
我正在遵循这些说明: http://www.nineproductions.com/linux/53-gitolite-hosting.html 在“添加存储库和用户”下。
1个回答

12
这些指令提到了使用一个拥有 id_rsa.pub 密钥的用户来克隆Git仓库。因此,您的账户必须在其 ~/.ssh 目录下拥有 id_rsaid_rsa.pub 这两个密钥,这是在声明“git”用户时由Gitolite使用的。现在,要添加一个新用户,您不仅需要在 gitolite.conf 文件中声明该用户(已完成),还需要将其公钥添加到本地 gitolite-admin 仓库的 "keys" 目录中。如果您在将 gitolite-admin 推送回服务器之前执行了这两个操作,那么Gitolite将会声明该新用户,并且您可以通过 git clone foo:newrepo 命令来使用它。请注意,如果您像我之前推荐的那样使用“git”账户进行Gitolite安装,则您的配置文件应该包含以下内容:
Host git
    HostName iptonas
    User git
    Port 123
    Identityfile ~/.ssh/git

然后去执行 git clone git:gitolite-admin

唯一需要使用 root 的时间是在服务器端安装时的开头,目的是声明/添加 git 账户。
之后,我真的建议你不要在任何过程中使用或看到 root


实际上,我生成了两个密钥对,因此我的 ~/.ssh 文件夹当前包含:id_rsaid_rsa.pubid_fooid_foo.pub

您的 ~/.ssh 文件夹应包含:

gitgit.pubid_fooid_foo.pub

Gitolite 基于公钥名称进行身份验证机制

再次强调:在服务器端,必须以像 'git' 这样的用户身份进行 gitolite 安装,并将 /tmp/git.pub(而不是 /tmp/id_rsa.pub)作为参数传递。


让我们回顾一下,因为这里有很多混淆。 Gitolite 是基于 ssh 的
这意味着你需要在服务器端(即 Gitolite 服务器)拥有一个帐户(这里是 'git'),在该帐户中,~git/.ssh/authorized_keys 文件将记录所有 Gitolite 管理员/用户的公钥。

在客户端(您的用户 foo)上,您需要拥有(至少对于您的第一个用户)来自 git 和 foo 的公钥和私钥。

您的 ~foo/.ssh/config 文件将包含:

Host gitadmin
    HostName iptonas
    User git
    Port 123        
    identityfile ~/.ssh/git

Host foo
    HostName iptonas
    User git
    Port 123
    identityfile ~/.ssh/foo
请注意,任何 ssh 通信的用户始终都是 git!您始终通过 ssh 地址如 ssh://git@iptonas:123/arepo 联系 Gitolite 服务器。
但是,由于您有多个 SSH 密钥可供选择,因此可以输入以下命令代替:
  • git clone gitadmin:gitolite-admin ,或
  • git clone foo:newRepo
第一条命令将允许您克隆 gitolite-admin 存储库(因为您使用公钥和私钥进行此操作,所以您有权限执行此操作)。
您可以使用该本地克隆将 foo.pub 放入 keys 目录中,并在 config 文件中声明 newRepo
然后,您将推回该存储库(Gitolite 将执行其魔术,创建一个新存储库,将 foo.pub 的内容添加到 ~git/.ssh/authorized_keys 中,同时为拦截由 foo 发出的任何 ssh 命令而添加强制命令脚本)。
(我更喜欢将该 ssh 快捷方式命名为“gitadmin”,而不是 git,即使公钥/私钥命名为“git.xxx”,因为“gitadmin”更好地传达了您将使用它进行的 ssh 命令的意图:您将管理 git 访问权限)
第二个命令允许您克隆您的 newRepo 并在其中工作。
请注意:
  • ssh gitadmin,或
  • ssh foo
将显示每个 ssh 快捷方式“gitadmin”和“foo”所使用的 ssh 密钥关联的 Gitolite 版本和权限,这些信息在 ~foo/.ssh/config 文件中定义。

我是否应该为git创建密钥集,并在配置中添加“identityfile ~/.ssh/git”? - Jay
好的,我按照所有这些说明进行了操作,并尝试运行“git push git:gitolite-admin”。然后要求输入git的密码,输入后我得到了以下信息:“无法更改目录到主目录/var/services/homes/git:没有那个文件或目录\n致命错误:'gitolite-admin'似乎不是git存储库\n致命错误:远程端意外挂断。”我猜我必须找到某种方法来编辑~/.profile或其他什么东西..?我该如何访问该文件? - Jay
好的,我成功地创建了git用户,并且也能够无问题地使用git访问NAS。然而,我正在尝试为我的“foo”用户在“配置Git托管用户的配置文件和主目录”下的步骤6中创建$ HOME / bin,但是出现以下错误:“mkdir:无法创建目录'/ volume1 / home / foo / bin':权限被拒绝”。 我生成了密钥并将它们放在适当的位置,我还修复了/volume1/home/foo/.profile文件以反映foo主目录的正确路径。我是否遗漏了什么? - Jay
虽然我已经成功设置了用户“git”,并能够使用“git”克隆和推送存储库“gitolite-admin”,但我无法从/推送到我的新存储库“newrepo”。我输入“git clone git:newrepo”,得到“Cloning into 'newrepo'... FATAL: R any newrepo git DENIED by fallthru (or you mis-spelled the reponame) fatal: The remote end hung up unexpectedly”。我输入“git push --all git:newrepo”,得到“FATAL: W any newrepo git DENIED by fallthru (or you mis-spelled the reponame) fatal: The remote end hung up unexpectedly”。 - Jay
1
@Jay:“我新建用户“foo”,是否应该遵循“配置Git托管用户的配置文件和主目录”步骤?” 不应该:此部分纯粹是用于配置服务器上的Git帐户,该帐户将用于所有SSH通信。我将编辑我的回答以提供更多信息。 - VonC
显示剩余12条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接