例如,
[email protected]:JohnCoates/Aerial.git
在这个命令中,我认为
git: username in GitHub Unix server
github.com: host name
/Aerial.git: directory
。
那么,什么是:JohnCoates
? 一般来说,会有一个端口号,但是JohnCoates
看起来不像端口号。
PS 我找到了这个答案,通过阅读,它JohnCoates
看起来像是目录的一部分。但是为什么没有呢/
?
https://stackoverflow.com/questions/5279624/whats-the-purpose-of-the-colon-in-this-git-repository-url
答案1
您在这里看到的不是 URL,而是 rsh/rcp 样式的地址,类似于现在仍在使用的地址scp
。rsync
因此,rsh 语法与 URL 不同:冒号后面的所有内容都是目录路径,并且没有对端口规范作出规定。
您仍然正确,git
ingit@...
是服务器上的 Unix 用户名,github.com
是主机名。我认为这可能是 URL 继承的从rsh 样式的地址。
(原始 rsh 具有当今不常见的安全模型,不允许使用不同的端口;ssh 使用单独的命令行选项-p
在需要时进行更改。)
因此整个JohnCoates/Aerial.git
是目录路径。为什么它不以 开头/
?首先,再次强调,因为这不是 URL 格式的地址,而是用作:
字段分隔符。其次,因为服务器不需要在路径中使用前导斜杠。
在普通的 Unix SSH 服务器上:
路径不需要
/
以相对的到当前目录。在 Git 地址中,这意味着它相对于用户的家目录。由于 RSH/SSH 是用于登录系统帐户,它们有一个“主目录”的概念,就像本地登录一样。当您登录系统时,您的命令从 开始
/home/UserName
(直到您 cd 到其他地方),因此运行ls Projects
与 相同ls /home/UserName/Projects
。所有使用 SSH 传输的软件(包括 SFTP、Git 和 Rsync)也可以使用此功能。例如,如果您尝试使用地址从简单的 SSH 服务器克隆,则
[email protected]:Projects/App.git
这与克隆相同[email protected]:/home/fred/Projects/App.git
。(如您所见,绝对路径确实以
/
– 开头,但它们是仍然使用 rcp 地址中的 a 分隔:
。)在 GitHub、GitLab 和其他自定义系统上:
GitHub 运行自定义 git,它不会直接将存储库名称映射到文件系统路径。相反,它会根据正则表达式手动解析收到的路径,
^/?(.+)/(.+)\.git$
然后在 SQL 数据库中查找结果。因此,GitHub 的“路径”实际上只是一个自定义字符串,不需要遵循任何常规路径规则。举个例子,GitHub 接受以下路径:和没有前导斜杠,正如您在下面的 URL 示例中看到的那样。
话虽如此,Git还支持 URL 样式的地址。您的示例也可以写成:
ssh://[email protected]/JohnCoates/Aerial.git
现在路径/JohnCoates/Aerial.git
正如您所期望的(在 URL 中它始终是绝对的)。
请注意,尽管路径不同,GitHub 仍然以相同的方式接受它 - 但标准 Unix 服务器不会。(它会要求要指定的完整路径,包括主目录。)继续我之前的例子:
[email protected]:/home/fred/Projects/App.git
↓
ssh://[email protected]/home/fred/Projects/App.git