Здесь показаны различия между двумя версиями данной страницы.
— |
vcs:multiple-gitlab-accounts-ssh-config [2016/05/30 21:58] (текущий) |
||
---|---|---|---|
Строка 1: | Строка 1: | ||
+ | ====== GitHub/GitLab: одновременная работа с несколькими репозитариями ====== | ||
+ | ===== Введение ===== | ||
+ | По долгу службы приходится много работать с git, и чаще всего это клиент командной строки. Я не использую различные gui клиенты, а их на самом деле уже достаточно много: | ||
+ | * [[https://www.sourcetreeapp.com/|source tree]] | ||
+ | * [[https://tortoisegit.org/|tortoise git]] | ||
+ | * [[https://desktop.github.com/|GitHub Desktop]] | ||
+ | * [[http://www.collab.net/products/giteye|giteye]] | ||
+ | * [[https://git-for-windows.github.io/|git for windows]] | ||
+ | * [[https://gitextensions.github.io/|Git Extensions]] | ||
+ | |||
+ | Возможно дело привычки, а возможно, мне просто не нужны все возможности таких клиентов. Как правило мне хватает git клиента из состава [[http://cmder.net/|cmder]], без которого работа в консоли windows это просто сущий ад. | ||
+ | |||
+ | Так как большая часть репозитариев использует аутентификацию по ключам, то для быстрого доступа очень удобно использовать настройки ssh клиента, которые описываются в файле ~/.ssh/config и имеют вид | ||
+ | |||
+ | <html> | ||
+ | <pre class="hl_js ini"> | ||
+ | Host gitlab.example.com | ||
+ | HostName gitlab.example.com | ||
+ | User git | ||
+ | IdentityFile ~/.ssh/gitlab.example.com.key | ||
+ | IdentitiesOnly yes | ||
+ | PreferredAuthentications publickey | ||
+ | </pre> | ||
+ | </html> | ||
+ | |||
+ | В случае windows файл будет располагаться в C:\Users\alex\.ssh\config. Но в определенный момент возникает проблема, как производить аутентификацию, когда url репозитария один и тот же, а меняется лишь имя репозитария, ну например, | ||
+ | |||
+ | <cli> | ||
+ | ssh://git@gitlab.example.com:2222/GROUP1/project11.git | ||
+ | ssh://git@gitlab.example.com:2222/GROUP2/project21.git | ||
+ | ssh://git@gitlab.example.com:2222/GROUP3/project31.git | ||
+ | </cli> | ||
+ | |||
+ | Есть несколько путей решения данной проблемы. Ниже рассмотрим их. | ||
+ | |||
+ | |||
+ | |||
+ | ===== Настройка ssh клиента ===== | ||
+ | |||
+ | Первый способ заключается в использовании т.н. алиасов, т.е. когда в Host мы указываем уникальный идентификатор для связки host + repostory. Ну например | ||
+ | |||
+ | <cli> | ||
+ | Host group1-project1 | ||
+ | HostName gitlab.example.com | ||
+ | User git | ||
+ | IdentityFile ~/.ssh/group1_project1.key | ||
+ | IdentitiesOnly yes | ||
+ | PreferredAuthentications publickey | ||
+ | </cli> | ||
+ | |||
+ | И затем при работе с этим репозитарием использовать | ||
+ | <cli prompt='λ'> | ||
+ | λ git clone ssh://group1-project1:2222/GROUP1/project11.git | ||
+ | </cli> | ||
+ | |||
+ | Итак, мой тестовый config файл имеет вид | ||
+ | <cli prompt='λ'> | ||
+ | λ 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 | ||
+ | </cli> | ||
+ | |||
+ | А теперь пробуем клонировать проекты | ||
+ | <cli prompt='λ'> | ||
+ | λ 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. | ||
+ | </cli> | ||
+ | |||
+ | Как видим, все работает. | ||
+ | |||
+ | |||
+ | |||
+ | ===== Использование GIT_SSH_COMMAND ===== | ||
+ | Альтернативный вариант заключается в использовании переменной окружения **GIT_SSH_COMMAND**. Но данный вариант будет работать только на linux, ну либо при использовании git bash | ||
+ | <cli prompt='$'> | ||
+ | $ GIT_SSH_COMMAND="ssh -i ~/.ssh/github_casperjs.key" git clone git@gitlab.example.net: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. | ||
+ | </cli> |