`git clone` over" dumb" http协议失败,找不到“存储库”

时间:2015-09-04 13:59:48

标签: git

我的问题

我尝试使用dumb http protocol在我们公司的内部网服务器上共享git仓库,Git Clone - Repository not found应该只需要文件访问权限,但它失败了

fatal: repository 'http://my-url/repo.git' not found

但是在Firefox中粘贴相同的链接会给我带有branches/configdescriptionHEAD等的回购索引所有目录和文件都是可读的。 事实上,如果我使用wget以递归方式下载整个内容,我可以在本地git clone,因此所有必需的文件似乎都可以无问题地访问。

$ wget -r --no-parent --reject "index.html*" http://my-url/repo.git
$ git clone repo.git test
Cloning into 'test'...
done.

继续调试我尝试使用GIT_CURL_VERBOSEGIT_TRACE详细输出:

$ GIT_CURL_VERBOSE=1 GIT_TRACE=1 git clone http://my-url/repo.git test
trace: built-in: git 'clone' 'http://my-url/repo.git' 'test'
Cloning into 'test'...
trace: run_command: 'git-remote-http' 'origin' 'http://my-url/repo.git'
* Couldn't find host my-url in the .netrc file; using defaults
* About to connect() to my-url port 80 (#0)
*   Trying <ip>...
* Connected to my-url (<ip>) port 80 (#0)
> GET /repo.git/info/refs?service=git-upload-pack HTTP/1.1
User-Agent: git/1.8.3.1
Host: my-url
Accept: */*
Accept-Encoding: gzip
Pragma: no-cache

< HTTP/1.1 404 Not Found
< Date: Fri, 04 Sep 2015 13:41:56 GMT
< Server: Apache/2.2.15 (Red hat)
< shortcut-icon: /images/logo.ico
< Content-Length: 346
< Content-Type: text/html; charset=iso-8859-1
< X-Cache: MISS from my-url
< 
* Connection #0 to host my-url left intact
fatal: repository 'http://my-host/repo.git/' not found

对我而言,看起来它在尝试&#34; smart&#34;之后就放弃了。 http协议。那么,发生了什么?从我能够收集到的愚蠢的http协议还没有被删除。为什么git在尝试智能http后会放弃?

详情

  • HTTP Server是Apache 2.2.15
  • 允许通过HTTP进行匿名读取访问
  • git version 1.8.3.1
  • 回购是裸的,没有符号链接
  • 手动调用
  • git update-server-info
  • 我无法访问服务器而无法对其进行配置,因此&#34; smart http&#34;选项已经结束。
  • 任何(全局,系统,本地)git-config中唯一的东西是user.nameuser.email
  • env | grep GIT为空
  • https的结果相同。

编辑: 更新了https(相同)的结果

类似问题

类似的问题,但没有在这种情况下有帮助的答案: git clone over HTTP Fails with “repository not found”

也类似,但接受的答案使用&#34; smart http&#34;协议。 tutorial

2 个答案:

答案 0 :(得分:4)

看来你必须跑:

git update-server-info

在通过http。

提供回购之前

您还需要打开更新后的挂钩:

mv hooks/post-update.sample hooks/post-update

每当新的更改被推送到回购时,都会重新运行 git update-server-info

有关详细信息,请参阅“Dumb http”部分:

https://git-scm.com/book/en/v2/Git-on-the-Server-The-Protocols

答案 1 :(得分:3)

TL; DR:手动提供禁用&#34; smart&#34;的选项http协议:

$ GIT_SMART_HTTP=0 git clone http://my-dumb-http-server/repo.git

但据说 https://git-scm.com/book/ch4-1.html

  

如果服务器没有响应Git HTTP智能服务,Git客户端将尝试回退到更简单的“哑”HTTP协议。

出于某种原因,似乎并非如此。但是在深入研究代码后,我发现他们检查了GIT_SMART_HTTP环境变量,并通过设置git cloneGIT_SMART_HTTP=0工作。