我正在用 Java 构建一个 Git 客户端,并想编写自动化测试来验证在 HTTP(s) 服务器上运行的 Git 命令是否正确运行。我见过许多本地小型 Java HTTP 服务器,但我不清楚要使它们正确响应 Git 命令需要什么。我试图避免安装本地 HTTP 服务器,因为我希望这些自动化测试可以在任何地方运行。谁能指出我正确的方向?
仅供引用,对于 ssh 远程测试,我使用 sshd mina 系统并使用其内置的 GitPackCommandFactory 取得了巨大的成功。类似于 HTTP(s) 的东西会很棒。
最佳答案
git的智能HTTP协议(protocol)在git-http-backend
中实现。这是一个 CGI 二进制文件,可以与一些网络服务器结合使用。不幸的是,它忽略了请求的内容长度并依赖服务器关闭其输入,这使得它与某些 CGI 服务器不兼容。
如果您有可用的 python,运行它的简单方法是使用 CGIHTTPServer。这个受上述不兼容性的影响。使用一个相当丑陋的解决方法,你仍然可以让它工作:
$ python -c 'import CGIHTTPServer; CGIHTTPServer.CGIHTTPRequestHandler.have_fork = False; CGIHTTPServer.test()' 8000
或者使用 python 3:
$ python3 -c 'import http.server; http.server.CGIHTTPRequestHandler.have_fork = False; http.server.test(HandlerClass=http.server.CGIHTTPRequestHandler, port=8000)'
这些将 CGIHTTPRequestHandler
的内部 have_fork
设置为 False
,这导致实现使用子进程和管道而不是 fork 来运行 CGI 二进制文件.使用这种方法,传入的请求被缓冲并写入管道,然后管道被关闭。这符合 git-http-backend
的预期模型,因此可以正常工作。
如果您首先使用的是没有 fork 的系统(即 Windows),则不需要解决方法,可以直接使用:
$ python -m CGIHTTPServer 8000
$ python3 -m http.server --cgi 8000
这两种设置都要求 git-http-backend
在 cgi-bin
目录下可用。最简单的设置是在裸 git 存储库中创建 cgi-bin 目录,符号链接(symbolic link)或将 git-http-backend
二进制文件复制到其中,然后从裸存储库启动服务器:
$ git clone --bare <repo> bare.git
$ cd bare.git
$ touch git-daemon-export-ok
$ mkdir cgi-bin
$ ln -s /usr/lib/git-core/git-http-backend cgi-bin/git
$ python -c 'import CGIHTTPServer; CGIHTTPServer.CGIHTTPRequestHandler.have_fork = False; CGIHTTPServer.test()' 8000
通过该设置,存储库位于 http://localhost:8000/cgi-bin/git
因为 git-http-backend
被符号链接(symbolic link)到 cgi-bin/git
。所以下面应该工作:
$ git clone http://localhost:8000/cgi-bin/git clonedRepoName
允许 push 裸仓库使用:
$ git config http.receivepack true
可以使用适当的环境变量进行更高级的设置,提供多个存储库。由于环境由服务器继承并传递给 CGI 二进制文件,因此只需导出所需的环境变量即可。查看git-http-backend documentation所有可能的配置和环境变量。
关于java - 可以响应 git 命令的本地嵌入式 HTTP 服务器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47758247/