По долгу службы приходится много работать с git, и чаще всего это клиент командной строки. Я не использую различные gui клиенты, а их на самом деле уже достаточно много:
Возможно дело привычки, а возможно, мне просто не нужны все возможности таких клиентов. Как правило мне хватает git клиента из состава cmder, без которого работа в консоли windows это просто сущий ад.
Так как большая часть репозитариев использует аутентификацию по ключам, то для быстрого доступа очень удобно использовать настройки ssh клиента, которые описываются в файле ~/.ssh/config и имеют вид
Host gitlab.example.com HostName gitlab.example.com User git IdentityFile ~/.ssh/gitlab.example.com.key IdentitiesOnly yes PreferredAuthentications publickey
В случае windows файл будет располагаться в C:\Users\alex\.ssh\config. Но в определенный момент возникает проблема, как производить аутентификацию, когда url репозитария один и тот же, а меняется лишь имя репозитария, ну например,
ssh://[email protected]:2222/GROUP1/project11.git ssh://[email protected]:2222/GROUP2/project21.git ssh://[email protected]:2222/GROUP3/project31.git
Есть несколько путей решения данной проблемы. Ниже рассмотрим их.
Первый способ заключается в использовании т.н. алиасов, т.е. когда в Host мы указываем уникальный идентификатор для связки host + repostory. Ну например
Host group1-project1 HostName gitlab.example.com User git IdentityFile ~/.ssh/group1_project1.key IdentitiesOnly yes PreferredAuthentications publickey
И затем при работе с этим репозитарием использовать
λ git clone ssh://group1-project1:2222/GROUP1/project11.git
Итак, мой тестовый config файл имеет вид
λ cat ~/.ssh/config Host github-casperjs HostName gitlab.example.net User git IdentityFile ~/.ssh/github_casperjs.key IdentitiesOnly yes PreferredAuthentications publickey Host github-phantomjs HostName gitlab.example.net User git IdentityFile ~/.ssh/github_phantomjs.key IdentitiesOnly yes PreferredAuthentications publickey
А теперь пробуем клонировать проекты
λ git clone ssh://github-casperjs:2222/github/casperjs.git Cloning into 'casperjs'... remote: Counting objects: 14841, done. remote: Compressing objects: 100% (5441/5441), done. remote: Total 14841 (delta 9312), reused 14841 (delta 9312) Receiving objects: 100% (14841/14841), 8.50 MiB | 1.53 MiB/s, done. Resolving deltas: 100% (9312/9312), done. Checking connectivity... done. Checking out files: 100% (285/285), done. λ git clone ssh://github-phantomjs:2222/github/phantomjs.git Cloning into 'phantomjs'... remote: Counting objects: 63957, done. remote: Compressing objects: 100% (30569/30569), done. remote: Total 63957 (delta 31979), reused 63574 (delta 31601) Receiving objects: 100% (63957/63957), 127.61 MiB | 1.28 MiB/s, done. Resolving deltas: 100% (31979/31979), done. Checking connectivity... done. Checking out files: 100% (638/638), done.
Как видим, все работает.
Альтернативный вариант заключается в использовании переменной окружения GIT_SSH_COMMAND. Но данный вариант будет работать только на linux, ну либо при использовании git bash
$ GIT_SSH_COMMAND="ssh -i ~/.ssh/github_casperjs.key" git clone [email protected]:2222/github/casperjs.git Cloning into 'casperjs'... remote: Counting objects: 14841, done. remote: Compressing objects: 100% (5441/5441), done. remote: Total 14841 (delta 9312), reused 14841 (delta 9312) Receiving objects: 100% (14841/14841), 8.50 MiB | 1.53 MiB/s, done. Resolving deltas: 100% (9312/9312), done. Checking connectivity... done. Checking out files: 100% (285/285), done.