2

I'm created user "gitproxy" on the server side, added my ssh key to its authorized keys and trying to work with git daemon over ssh:

gitproxy:~$ git daemon --port=2222 --verbose

but have the error: On client side:

o:~/git$ git clone ssh://server>:2222/home/gitproxy/git
Cloning into 'git'...
ssh: connect to host <server> port 2222: Connection refused
fatal: Could not read from remote repository.

On server-side:

[18666] Ready to rumble
[18667] Connection from 192.168.211.174:42416
fatal: protocol error: bad line length character: SSH-
[18666] [18667] Disconnected (with error)

Repo is exists. Also I normally enter this server via SSH without a password (so, my ssh key is accepted):

$ ssh gitproxy@192.168.201.84
gitproxy@192.168.201.84:~$

Also, I can get list of branches with git-receive-pack from my desktop (client side):

$ ssh gitproxy@192.168.201.84  git-receive-pack  /home/gitproxy/git
008fef8bbf80818e6b634ca56c3ef6c24e5bbdb7bf74 refs/heads/masterreport-status delete-refs side-band-64k quiet atomic ofs-delta agent=git/2.16.1
0046ef8bbf80818e6b634ca56c3ef6c24e5bbdb7bf74 refs/remotes/origin/HEAD
0048ef8bbf80818e6b634ca56c3ef6c24e5bbdb7bf74 refs/remotes/origin/master

I checked all the possible fixes that are proposed on stackoverflow. But git daemon still returns the error. I'll be very grateful for any help. Thanks in advance!

4

3 回答 3

0

但是我需要--access-hookof git daemon(或当我在客户端运行“git pull”时执行某些操作的任何其他机制)。

然后,仅使用 SSH(根本没有 git 守护进程),您可以使用我举例说明的SSH强制命令机制gitolite

在 ~gitproxy/.ssh/authorized_keys 中,您可以调用任何您想要执行操作的脚本,然后$SSH_ORIGINAL_COMMAND使用(其中将包括“ git-upload-pack|git-receive-pack|git-upload-archive"Git 命令)调用 Git 本身。

您甚至可以自行安装gitolite,因为它会为您管理授权部分。

于 2018-01-28T05:51:20.833 回答
0

git-daemon不说 SSH 协议,它说简单的 git 协议;协议的 URL 必须以 开头git://,而不是ssh://。即您的服务器的 URL 是git://192.168.201.84:2222/.

要通过 ssh 使用 git repo,您​​需要一个 ssh 服务器。所以看起来你有一个:在 gitproxy@192.168.201.84; 好的,那么 repo 的 URL 是ssh://gitproxy@192.168.201.84/home/gitproxy/git. 相同 URL 的另一种“类似 scp”的语法是gitproxy@192.168.201.84:git.

于 2018-01-27T22:35:35.700 回答
0

git 守护进程是一个实现git协议的服务器,即与git://...URL 一起使用的协议。它不理解 SSH 协议,所以当你这样做时:

git clone ssh://<服务器>:2222/home/gitproxy/git

您正在尝试<server>:2222通过 SSH 协议连接(由于ssh://...URL)。然后git daemon不理解 SSH 发送给它的内容(SSH-错误消息中的 是初始 SSH 握手的一部分)。

如果你真的打算使用 SSH 协议与远程仓库交互,完全没有必要使用git daemon。通过使用ssh://...URL 形式,git 命令将使用 SSH 调用所需的远程命令(receive-pack例如,您手动执行的命令)。在这种情况下,只需删除 URL 的端口规范并退出git daemon服务器。身份验证和加密由 SSH 作为传输机制提供,授权使用文件系统权限完成。

如果你真的想使用git daemongit协议,把 URL 改成是git://<server>:2222/...。请注意,该git协议不提供任何身份验证、加密或授权机制,并且暴露的存储库完全公开。

于 2018-01-27T22:36:34.107 回答