Вы не смотрите здесь URL-адрес - вы смотрите адрес в стиле rsh / rcp, аналогичный тому, который используется scp
и в rsync
наши дни. Таким образом, синтаксис rsh отличается от URL-адресов: все, что находится после двоеточия, является путем к каталогу, и нет никаких условий для спецификации порта.
Вы по-прежнему правы, что git
in 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
.(Как вы можете видеть, абсолютные пути начинаются с
/
- но они по- прежнему разделяются с использованием:
адресов в 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