即使给出了公钥,Gitosis也需要密码

时间:2009-05-25 14:45:59

标签: git installation gitosis

我在尝试在Archlinux上配置gitosis时遇到了一些问题

http://wiki.archlinux.org/index.php/Setting_Up_Git_ACL_Using_gitosis

我参考了这篇wiki文章并成功安装了gitosis。

  

$ sudo pacman -U gitosis-git-20090525-1-i686.pkg.tar.gz
  $ sudo -H -u gitosis gitosis-init< /tmp/id_rsa.pub

并修改/srv/gitosis/.ssh/authorized_keys以包含我本地用户的id_rsa.pub。

但是当我以本地用户身份运行git clone时,

  

$ git clone gitosis @ host:gitosis-admin.git

它说

  

/home/wyx/gitosis-admin/.git/
中初始化的空Git存储库   gitosis@10.132.140.73的密码:*****
  致命:'gitosis-admin.git'似乎不是一个git仓库   致命:远程端意外挂断了

因此git clone操作失败。我想知道为什么它试图在我的本地用户的目录(/ home / wyx)中初始化一个空的git存储库?既然我已经在.ssh / authorized_keys中添加了本地用户的id_rsa.pub,为什么还要求输入密码呢?

11 个答案:

答案 0 :(得分:20)

创建了一个空的存储库,因为这就是git的工作方式:它必须先启动一个repo才能开始将远程对象拉入其中。不幸的是,这意味着您必须在再次尝试克隆之前手动删除空仓库。

至于克隆失败的原因,看起来你的远程存储库路径使用了错误的语法; git clone不使用scp语法。事实上,如果你没有指定克隆协议,我相信它假设git协议而不是ssh,这可能就是它要求你输入密码的原因。试试这个:

$ git clone ssh://gitosis@host/~/gitosis-admin.git

答案 1 :(得分:8)

我也面临同样的问题“致命:'/ gitosis-admin.git'似乎不是一个有效的存储库。” 我搜索了很多问题,最后找到了解决方案。

实际上,gitosis用户的默认地址是“/ srv / gitosis”:如我的设置有ubuntu服务器10.04。

当我们写“git clone gitosis@server.com:gitosis-admin.git”时,它会搜索/ srv / gitosis中的gitosis-admin.git存储库。所以当我进入/ srv / gitosis时,我发现其中有另一个存储库,名为存储库,由gitosis-admin.git存储库组成。

所以实际上默认情况下gitosis-admin.git不在默认位置。所以我必须修改命令路径然后它工作正常。

我将存储库克隆到我的本地计算机上。我使用命令:

“git clone gitosis@server.com:repositories / gitosis-admin.git”,它对我来说很好。

请参阅您的案例中的gitosis-admin目录,我希望您能够解决您的问题。

答案 2 :(得分:6)

这就解决了我的问题(在Ubuntu上):

git clone gitosis@ns.home:/srv/gitosis/repositories/gitosis-admin.git

答案 3 :(得分:4)

Gitosis创建了自己的authorized_keys文件。如果您已经拥有该文件,请将其删除并允许gitosis-init重新创建它。一旦完成,不要弄乱文件。

答案 4 :(得分:2)

我在ubuntu上遇到了同样的问题,

它适用于git clone ssh://git@serverName/absolutePath/gitosis-admin.git

答案 5 :(得分:2)

我解决了类似的问题。它可能不完全是您的情况下发生的事情,但您可以尝试重新应用我所做的相同的故障排除。

我意识到当我为新用户推送密钥时,我得到了这个堆栈跟踪,这就是gitosis上的钩子无法处理新密钥的症状。

remote: Traceback (most recent call last):
remote:   File "/usr/local/bin/gitosis-run-hook", line 9, in <module>
remote:     load_entry_point('gitosis==0.2', 'console_scripts', 'gitosis-run-hook')()
remote:   File "/usr/local/lib/python2.7/dist-packages/gitosis-0.2-py2.7.egg/gitosis/app.py", line 24, in run
remote:     return app.main()
remote:   File "/usr/local/lib/python2.7/dist-packages/gitosis-0.2-py2.7.egg/gitosis/app.py", line 38, in main
remote:     self.handle_args(parser, cfg, options, args)
remote:   File "/usr/local/lib/python2.7/dist-packages/gitosis-0.2-py2.7.egg/gitosis/run_hook.py", line 81, in handle_args
remote:     post_update(cfg, git_dir)
remote:   File "/usr/local/lib/python2.7/dist-packages/gitosis-0.2-py2.7.egg/gitosis/run_hook.py", line 45, in post_update
remote:     config=cfg,
remote:   File "/usr/local/lib/python2.7/dist-packages/gitosis-0.2-py2.7.egg/gitosis/gitdaemon.py", line 95, in set_export_ok
remote:     for (dirpath, repo, name) in walk_repos(config):
remote:   File "/usr/local/lib/python2.7/dist-packages/gitosis-0.2-py2.7.egg/gitosis/gitdaemon.py", line 72, in walk_repos
remote:     assert ext == '.git'
remote: AssertionError

错误仅显示 ONCE ,因此我天真地将其视为暂时失败。

在实践中,Gitosis仅适用于我的密钥,但它不适用于我试图支持的任何用户。在~/.ssh/authorized_keys中,我找不到用户的公钥,我认为我刚刚添加了该公钥。这就是为什么我的朋友每次尝试克隆时都会被要求输入密码的原因。

我通过将这两行添加到gitosis.conf

,为Gitosis配置添加了调试功能
[gitosis]
loglevel=DEBUG 

我不得不继续添加和删除gitosis.conf文件中的用户,以便再次触发挂钩。我的调试日志显示

remote: DEBUG:gitosis.gitdaemon:Deny 'syncShare'
remote: DEBUG:gitosis.gitdaemon:Walking 'legacy.d', seeing ['buildtools', 'QA_Dashboard']
remote: DEBUG:gitosis.gitdaemon:Walking 'legacy.d/buildtools', seeing ['.git', 'conf', 'scripts'] 
remote: Traceback (most recent call last): 
etc ...

A-公顷!当钩子通过存储库执行“walk”时,它在.git下找到了legacy.d/buildtools目录,这正是assert ext == '.git'发生的位置。

我曾使用服务器存储来自其他存储库的简单克隆。请注意,普通克隆,而不是镜像或裸存储库。像每个克隆一样,它包含.git目录。

Gitosis中的钩子不知道如何处理.git目录。它认为它是一个空名称和中止的存储库。一旦我消灭了克隆,一切恢复正常。

答案 6 :(得分:1)

通常不需要编辑authorized_keys。

我曾经有过授权问题,即使我之前放了我的公钥,gitosis服务器仍然会问我密码。我意识到gitosis给了我一个警告“警告:gitosis.ssh:密钥文件中的不安全的SSH用户名:'myuser@myserver.pub'”,当我试图提交并将我的更改推送到gitosis时。

更改密钥文件和密钥文件名中的user @ host部分解决了我的问题。不知何故,gitosis不像以前那样。

答案 7 :(得分:0)

我终于让它像这样工作了

git clone ssh://git@host:1337/home/git/repositories/gitosis-admin.git

其中1337端口正在使用。

答案 8 :(得分:0)

同样的问题,在我的情况下,我在.ssh /中有错误的authorized_keys。我必须在某个时候搞砸了......

答案 9 :(得分:0)

移动到新的Ubuntu机器并自己遇到这个问题后,我在这里看到了几个答案让我朝着正确的方向前进,即使用 .git 文件的绝对路径对于每个存储库。

尝试了一下我注意到相对于git用户主目录的路径也有效,这缩短了类似的内容:

git@host:/var/git/repositories/project.git

git@host:repositories/project.git

再玩一点我尝试将项目文件从存储库移动到git的主目录中;现在只需要项目:

git@host:project.git

有点hacky,但我怀疑会造成任何伤害。很高兴知道改变了什么,因为我在另一个Ubuntu(旧版)上托管gitosis,并且能够使用上面的最后一个符号将项目放在repositories目录中。

答案 10 :(得分:0)

要更深入地了解身份验证问题,请收集详细的调试日志详细信息:使用

df = df.set_index(['a', 'b', 'in/out']).unstack() df.columns = df.columns.map(''.join) df = df.reset_index() print (df) a b cin cout din dout 0 1 1 3 4 2 3 1 2 3 3 1 8 4 2 3 1 3 1 2 1

直接手动连接技巧(其中,最重要的是/通常使用最精确/直接的上下文引用;在这种情况下:实际的ssh机制而不是工具 - 远程 - 因此必然不太精确 - git处理!)。