我有一个运行 Nginx 的 Debian,git.example.com
我用它来存储 git 存储库。
我可以通过运行 SSH 来拉取/推送/克隆。 (这是我的主目录中指向的符号链接)git clone [email protected]/git/my_repo
git
/mnt/primary_storage/git
但是,当我使用 HTTP(S) 克隆/拉取时出现以下错误:
fatal: http://git.example.com/my_repo.git/info/refs not valid: is this a git repository?
无论我是否克隆真实的存储库,都会出现此错误
Nginx 配置的相关部分是:
server {
listen 80;
server_name git.example.com;
root /mnt/primary_storage/git;
location ~ (/.*) {
auth_basic "Login";
auth_basic_user_file /mnt/primary_storage/.htpasswd;
include fastcgi_params;
fastcgi_param REMOTE_USER $remote_user;
fastcgi_param SCRIPT_FILENAME /usr/lib/git-core/git-http-backend;
fastcgi_param GIT_HTTP_EXPORT_ALL "";
fastcgi_param GIT_PROJECT_ROOT /mnt/primary_storage/git;
fastcgi_param PATH_INFO $1;
fastcgi_pass localhost:9000;
}
}
令人恼火的是,我在另一台装有 Ubuntu 的服务器上运行了完全相同的设置,并且运行正常。所以我不知道是什么原因造成的。除了这个问题之外,服务器上的一切都运行正常。
是的,StackExchange 网站上有一些类似的问题,但没有一个能帮助我。例如,其中一些人正在处理 Github,他们没有先设置存储库。其他人的 Git 地址是错误的。还有人说我应该运行,git config --global http.proxy
但这没有帮助。
另外,我已经三次检查了所有文件夹/文件权限,并且它们对于 Nginx 用户来说都是可读写的。
答案1
为了正确地通过 HTTP(或任何其他支持打包的协议)进行打包,您需要手动进行打包。
您可以git update-server-info
在存储库目录中运行来执行此操作。
post-update
将其放在repo 中的 Git hook中可能会很方便,这样当您推送时它就会自动完成。
mtak@gen1:/srv/git/puppet.git/hooks$ cat post-update
#!/bin/sh
#
# An example hook script to prepare a packed repository for use over
# dumb transports.
#
# To enable this hook, rename this file to "post-update".
exec git update-server-info
答案2
此错误消息与“存储库不存在”相同。
检查您使用的 URL 是否显示在命令的“获取和推送”下:
git remote show origin
这应该给出类似这样的结果[email protected]:[REPO-NAME].git
。
如果 URL 错误,可以通过以下命令修复:
git remote set-url origin [REPO-URL]
答案3
确保您尝试访问的 git repo 支持 HTTPS 协议?
另请注意,存储库名称区分大小写。
另外,请确保存储库 URL 可以从您的网络访问。可能存在端口 443 问题(https)。
如果您使用代理,请确保为 git 正确设置了代理!
git config --global http.proxy
另请参阅此处的信息: https://confluence.atlassian.com/bbkb/info-refs-not-valid-is-this-a-git-repository-313467635.html
希望这可以帮助。