我在尝试在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,为什么还要求输入密码呢?
答案 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]
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处理!)。