git URL中的“.git”是什么意思?

17

我在foo中设置了一个git仓库

cd
mkdir foo
cd foo
git init

现在我想远程引用它

git clone git+ssh://me@somemachine/home/me/foo.git

fatal: git remote error '/home/me/foo.git' does not appear to be a git repository

我将“.git”去掉后它就工作了。但是我几乎在每个示例中都看到结尾带有“.git”。这个“.git”是什么意思?

另外,“ssh://...”和“git+ssh://...”之间有什么区别(无论是在含义上还是在实际方面)。


可能是为什么一些存储库的URL以.git结尾,而其他存储库则没有?的重复问题(该问题稍后提出,但有更好的答案)。 - blahdiblah
4个回答

16

".git" 是什么意思?

.git 出现在 git 仓库文件夹末尾只是一种命名惯例,通常表示该文件夹是服务器而不是客户端。我认为这取决于仓库是否为“裸”(即没有工作目录)。克隆 URL 只指向一个文件夹,如果实际文件夹末尾有 .git,则加上。否则,不加。

此外,“ssh://...”和“git+ssh://...”之间有何区别(包括含义和实际效果)?

实际上它们基本相同。从意义上讲,它们使用不同的协议连接到服务器。ssh:// 打开一个 SSH 连接到特定用户的服务器,并在服务器上运行 git 命令(通常服务器会将命令限制在用户的 shell 中,例如 /usr/bin/git-shell)。git+ssh:// 意味着服务器本地运行 git daemon,客户端需要先打开一个 SSH 连接才能与守护进程交互。


1
另外需要注意的是,git+ssh:// 几乎不再使用,并且根据其他答案的说法,在当前版本的 git 中已被弃用和删除。 - Robert Rouhani
这个文件夹是服务器而不是客户端...什么?! - robertmain
我相信我的意思是,它是仓库的裸拷贝,唯一的目的是在更集中的服务器/客户端设置中共享(Git 现在几乎完全使用),而不是一个人们通过检出仓库并将其配置为彼此远程的网络(其中文件夹名称通常不以“.git”结尾)。 - Robert Rouhani
查看我的默认设置下当前检出的存储库时,在Windows上使用git 2.12.2.windows.2和在Ubuntu上使用git 2.7.4进行克隆时,会剥离.git后缀。我的意思是,当在~中克隆形式为https://github.com/foo/bar.git的存储库时,将创建目录~/bar/而不是~/bar.git/。如果这恰好是服务器控制的内容,则我已经从Github、Gitlab和BitBucket观察到了这种行为。 - Robert Rouhani

7

通常(但绝不是普遍规定),裸的 git 仓库以名称以 .git 结尾的目录中创建。这就是你通常在仓库 URL 尾部看到 .git 的原因。

我不确定 git+ssh 方案 - 实际上我在 git man 手册中找不到它的参考。根据 Eclipse 论坛 的说法,该协议已被移除,改用普通的 ssh。(当然,Eclipse 论坛并不是关于 git 的官方信息来源,但这是有道理的。我从来不知道它们之间的区别应该是什么。)


3
.git 后缀只是一种惯例,用于表示该目录是一个裸的 git 仓库(即没有工作副本)。实际上并不是必需的。
至于 git+ssh://,根据 git-fetch 手册,它是不被允许的:
Git 原生支持 ssh、git、http、https、ftp、ftps 和 rsync 协议。以下语法可与它们一起使用:
- ssh://[user@]host.xz[:port]/path/to/repo.git/ - git://host.xz[:port]/path/to/repo.git/ - http[s]://host.xz[:port]/path/to/repo.git/ - ftp[s]://host.xz[:port]/path/to/repo.git/ - rsync://host.xz/path/to/repo.git/
ssh 协议也可以使用类似 scp 的替代语法:
[user@]host.xz:path/to/repo.git/

0

.git没有特殊的含义,是否需要添加取决于仓库在服务器端的位置,有无.git。

有时带有.git的仓库意味着它是一个裸仓库。


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