среда, 22 декабря 2010 г.

Индивидуальные ssh ключи для разных git проектов

Ситуация - 2 проекта в разных git репозиториях. Скажем один с работы один личный. Допустим тебе срочно нужно подправить что-то в личном проекте, ты находишься на работе а нужно загрузить обновлённые файли в репозиторий. Я пользуюсь сервисом codaset.com который, как известно, "как github только лучше" (в частности предлагает бесплатно 1 приватный проект для разработки с не ограниченным количеством участников и больше места). Соответственно по работе там один акк, а личный - другой и у них разные ssh ключи для доступа (что тоже логично, как мне кажется), рабочий и личный. Личный у меня на флешке на шифрованном виртуальном диске.

Проблема в том, что пытаясь залепить push в репу из личного проекта система подхватывает рабочий публичный ключ (т.к. она уже работала с этим сервером) и соответсвенно не пускает меня с левым ключём в частный репозиторий.

Выходы есть такие:
  1. Можно добавить рабочий ключ в список допущенных в личном репозитории, но! Страдает приватность, т.к. на работе мало ли кто имеет доступ к ПК и вообще.
  2. Можно убирать рабочий ключ и заливать в папку ~/.ssh/ свой и потом менять - ну это понятно не наш метод. Да и забыть можно ключь свой на работе, что тоже не кошерно.
Наш метод:

В файл ~/.ssh/config добавляем описания хостов

Host GitQnub
  Hostname=codaset.com
  IdentityFile=/media/truecrypt1/qnub

Host GitWork
  Hostname=codaset.com
  IdentityFile=~/.ssh/work/work

Как видно рабочие ключи нужно также перенести из папки ~/.ssh т.к. она по умолчанию просматривается системой на предмет наличия ключей.

Соответственно IdentityFile это путь к ключу для данного репозитория (свой и рабочий). Остаётся только заменить домен Hostname в параметре url файла .git/config вашего проекта на значение Host.

Пример:

Было:

[remote "origin"]
 url = git@codaset.com:work/work-project.git

Стало:

[remote "origin"]
 url = git@GitWork:work/work-project.git

После этого команды git fetch, git push и git pull будут использовать назначенные ключи для назначенных репозиториев. Аналогичная штука работает и с github.