git-daemon:"无法在主机(null)端口9418上分配任何侦听套接字"

4
在Debian squeeze上,我遇到了syslog错误:
unable to allocate any listen sockets on host (null) port 9418

我也无法远程克隆。

文件/etc/service/git-daemon/run

"$(git --exec-path)"/git-daemon --verbose --base-path=/var/cache/git --detach --syslog --reuseaddr --export-all

netstat -l | grep git 的输出结果:

tcp        0      0 *:git                   *:*                     LISTEN     
tcp6       0      0 [::]:git                [::]:*                  LISTEN

我目前正在使用sv start/stop命令行重启服务,并杀死服务进程以确保它被重新加载。

也许我错过了一些非常愚蠢的东西。 非常感谢您的帮助。


为什么不直接使用ssh跳过守护进程?我正在这样做,并且使用gitolite没有任何问题。 - Adam Dymitruk
很好,但是ssh不允许匿名访问。 - Dietrich Epp
确切地说,我必须将其公开。 - vmassuchetto
3个回答

1
那种问题是提醒我们的好机会,让我们记住git daemon带有以下选项:
--init-timeout=<n>

连接建立和客户端请求接收之间的超时时间(以秒为单位)(通常是相当低的值,因为这应该基本上是立即完成的)。

--timeout=<n>

客户端子请求的超时时间(以秒为单位)。
这包括服务器处理子请求所需的时间和等待下一个客户端请求的时间。

这确保套接字可供分配,而不是留给可能不存在的客户端。

git 2.9.x+(2016年第三季度)将更早地检测到这些情况:

请参见提交 a43b68a(由Eric Wong(ele828于2016年5月25日提交)。 (由Junio C Hamano -- gitster --提交 a43b68a中合并,2016年5月25日)

daemon: 为所有套接字启用 SO_KEEPALIVE

当没有指定 --[init-]timeout 选项运行 "git daemon" 时,来自客户端的连接如果悄悄离线,可能会占用很长时间的资源
已启用套接字级别的 KEEPALIVE,以便操作系统能够注意到这些失败的连接。

虽然存在 --init-timeout--timeout 选项,而且我从未在没有它们的情况下运行过 git daemon,但有些用户可能会忘记设置它们,并在连接失败时遇到挂起的守护进程。

启用套接字级超时,以便内核可以根据需要发送 keepalive 探测包以检测失败的连接。


1

我认为,当你使用--listen参数的git-daemon时,它不会抱怨缺少host...


0

相对于 git daemon 的设置,这种方法可能更容易:

  • 对于公共存储库,将其放到 github 上
  • 对于私有存储库,设置 sshd/ssh 可能更容易。

这个问题也曾经在我的服务器上发生过。

当无法从 git://... 克隆时,我使用两种方法:

1. 通过 git over ssh,在 ~/.ssh/authorized_keys 中添加用户的公钥,然后不需要用户名/密码即可访问存储库:

git clone user@host:/path/to/git/repository/myproject.git

2、将代码库放置在 Web 服务器可访问的目录下,例如:

/var/www/git

请确保 /var/www/ 可以访问,例如将其设置为 apache httpd 的文档根目录。这样用户至少可以获取它。


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