我注意到,从 GitHub 克隆存储库时,末尾缺少.git
扩展名的 URL 仍将正确克隆。
例如,此命令:
git clone https://github.com/kach/nearley
将与此地址相同的功能:
git clone https://github.com/kach/nearley.git
此功能是由 Git 命令提供的,还是由服务器端的 GitHub 处理的?如果这是GitHub的一个功能,他们会在任何地方记录吗?
关于他们如何或为何实施这一点的任何说明也将不胜感激。
.git
扩展表示一个裸存储库。什么是裸存储库?
Git 似乎并不关心您是否不为以这种方式命名的存储库提供 .git
扩展名,但如果您确实提供了它并且存储库没有该扩展名,您的克隆将失败。因此,似乎专门提供此功能的是 Git 而不是 Github。
有关更多评论,请参阅此其他问题。
还有 Git 文档。
这是GitHub的一个功能。当你运行 git clone https://github.com/example/path
时,git 会自动追加/info/refs?service=git-upload-pack
并获取https://github.com/example/path/info/refs?service=git-upload-pack
。
GitHub 实际上并没有在该 URL 上提供"智能 HTTP"git 传输协议,而是在名称中带有 .git 的变体中提供它:https://github.com/example/path.git/info/refs?service=git-upload-pack
。但是,作为特殊例外,如果用户代理标头包含 git/
,GitHub 将通过回复 Content-Type: application/x-git-upload-pack-advertisement
来提供智能 HTTP 传输协议。自己尝试用卷曲:
$ curl https://github.com/jsha/minica/info/refs?service=git-upload-pack -si | head
HTTP/1.1 404 Not Found
$ curl https://github.com/jsha/minica/info/refs?service=git-upload-pack -si -H 'User-Agent: git/1.0'
HTTP/1.1 200 OK
Server: GitHub Babel 2.0
Content-Type: application/x-git-upload-pack-advertisement
...
001e# service=git-upload-pack
你可以跳过 .git,git 是一个版本控制系统,通常知道如何仅从其名称(不带".git"(找到完整的存储库路径。例如,golang语言的goget github.com/username/reponame 命令:即使没有扩展,它也会克隆该存储库。这里是参考。
有关更多评论,请参阅此其他问题。
> 正如@Matt所指出的,git 似乎并不在乎。但是,它似乎由客户端处理,而其他客户端库(如JGit(似乎确实关心。我花了将近一个小时才知道为什么我的 Spring 配置服务器会在启动时抛出此异常:
NoRemoteRepositoryException: ... <some-repo-url>/git-upload-pack not found
具有相同 URL 的git clone
运行良好。这只是在spring.cloud.config.server
下配置的存储库 URL 中缺少的 .git 后缀 - 我太习惯于省略它了。