Вы не смотрите здесь URL-адрес - вы смотрите адрес в стиле rsh/rcp, похожий на тот, который все еще используется scp
и rsync
наши дни. Таким образом, синтаксис rsh отличается от URL-адресов: все, что находится после двоеточия, является путем к каталогу, и нет никаких условий для спецификации порта.
Вы по-прежнему правы, что git
в git@...
- это имя пользователя Unix на сервере, а github.com
- это имя хоста. Я думаю, что это, вероятно, то, что URL-адреса унаследованы от адресов в стиле rsh.
(Оригинальный rsh имел необычную модель безопасности в наши дни и не позволял использовать другой порт; ssh использует отдельный параметр командной строки -p
чтобы изменить его при необходимости.)
Таким образом, весь JohnCoates/Aerial.git
является путем к каталогу. Почему это не начинается с /
? Прежде всего, еще раз, потому что это не адрес в формате URL, а используется :
в качестве разделителя полей. Во-вторых, потому что сервер не требует косой черты в путях.
На простых серверах Unix SSH:
Путь не должен начинаться с /
когда он относительно текущего каталога. В Git-адресах это означает, что он относится к домашнему каталогу пользователя.
Поскольку RSH/SSH предназначены для входа в системную учетную запись, они имеют понятие "домашний каталог", точно так же, как и локальные учетные записи. Когда вы входите в систему, ваши команды начинаются с /home/UserName
(до тех пор, пока вы не перейдете в другое место), поэтому запуск ls Projects
аналогичен ls /home/UserName/Projects
.
Все программы, которые используют SSH транспорт - включая SFTP, Git и Rsync - также могут использовать эту функцию. Например, если вы пытались клонировать с простого SSH-сервера, используя адрес fred@example.com:Projects/App.git
, это аналогично клонированию fred@example.com:/home/fred/Projects/App.git
,
(Как вы можете видеть, абсолютные пути начинаются с /
-, но они по- прежнему разделяются с помощью адресов :
in rcp.)
На GitHub, GitLab и других пользовательских системах:
GitHub запускает пользовательский git, который напрямую не отображает имена репозитория в пути файловой системы. Вместо этого он вручную анализирует полученный путь по отношению к регулярному выражению, такому как ^/?(.+)/(.+)\.git$
и ищет результат в базе данных SQL.
Таким образом, "путь" GitHub - это на самом деле просто пользовательская строка, которая не должна следовать ни одному из обычных правил пути. Как один из примеров этого, GitHub принимает пути как с косой чертой, так и без нее, как вы увидите в примерах URL ниже.
При этом Git также поддерживает адреса в стиле URL. Ваш пример также может быть записан как:
ssh://git@github.com/JohnCoates/Aerial.git
Теперь путь будет /JohnCoates/Aerial.git
как и следовало ожидать (в URL-адресах он всегда абсолютен).
Обратите внимание, что хотя путь другой, GitHub по-прежнему принимает его таким же образом, но стандартный сервер Unix не будет. (Для этого потребуется указать полный путь с домашним каталогом.) Чтобы продолжить мой предыдущий пример:
fred@example.com:/home/fred/Projects/App.git
↓
ssh://fred@example.com/home/fred/Projects/App.git