Что означает имя после двоеточия в ssh-адресе GItHub?

490
Hidehiro NAGAOKA

Например,

git@github.com: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

0

1 ответ на вопрос

0
grawity

Вы не смотрите здесь URL-адрес - вы смотрите адрес в стиле rsh / rcp, аналогичный тому, который используется scpи в rsyncнаши дни. Таким образом, синтаксис rsh отличается от URL-адресов: все, что находится после двоеточия, является путем к каталогу, и нет никаких условий для спецификации порта.

Вы по-прежнему правы, что gitin 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 

Похожие вопросы