2015-02-03 2 views
6

Как использовать GitPython вместе с определенными ключами SSH?Ключи GitPython и SSH?

Документация не очень тщательна по этому вопросу. Единственное, что я пробовал до сих пор, - Repo(path).

ответ

7

Обратите внимание, что все перечисленные ниже действия будут работать только в GitPython v0.3.6 или новее.

Вы можете использовать переменную окружения GIT_SSH, чтобы предоставить исполняемый файл git, который на своем месте выберет ssh. Таким образом, вы можете использовать любой вид ssh-ключа, когда git пытается подключиться.

Это работает либо на вызов с использованием context manager ...

ssh_executable = os.path.join(rw_dir, 'my_ssh_executable.sh') 
with repo.git.custom_environment(GIT_SSH=ssh_executable): 
    repo.remotes.origin.fetch() 

... или более настойчиво используя set_environment(...) метод Git объекта вашего хранилища:

old_env = repo.git.update_environment(GIT_SSH=ssh_executable) 
# If needed, restore the old environment later 
repo.git.update_environment(**old_env) 

Как вы можете установите любое количество переменных окружения, вы можете использовать некоторые для передачи информации вместе с вашим ssh-скриптом, чтобы помочь ему выбрать желаемый ключ ssh для вас.

Дополнительная информация о становлении этой функции (новая в GitPython v0.3.6) вы найдете in the respective issue.

+1

Должен признать, что я борюсь с этим, как хорошо. Я бы предпочел написать собственный скрипт SSH. Есть ли способ определить ключ для использования? Я новичок в Python, и учебник/API просто не совсем понял, где мне нужно, чтобы это работало. Благодарю. –

+0

Оказывается, начиная с git 2.3, это в значительной степени встроено. Используя новую GIT_SSH_COMMAND, вы можете напрямую указать команду ssh -i ..., а не полагаться на внешний скрипт. – Byron

+1

Спасибо. Для меня не работает. Что мне не хватает (форматирование отстой в комментариях, но, надеюсь, вы получите эту идею)? 'с git_project.git.custom_environment (GIT_SSH_COMMAND = 'ssh -i ~/.ssh/id_rsa [email protected]'): git_project.remotes.origin.push (git_project.heads.master)'. Если я добавлю параметр -T и запустим из командной строки, я войду в систему, как ожидалось. Ошибка форматирования в моем коде Python? –

4

Вслед работал на меня gitpython == 2.1.1

import os 
from git import Repo 
from git import Git 

git_ssh_identity_file = os.path.expanduser('~/.ssh/id_rsa') 
git_ssh_cmd = 'ssh -i %s' % git_ssh_identity_file 

with Git().custom_environment(GIT_SSH_COMMAND=git_ssh_cmd): 
    Repo.clone_from('[email protected]', '/path', branch='my-branch') 
+0

Что такое переменная 'git' в этом примере? –

+0

Вы имеете в виду git @? Это URL-адрес репо, например [email protected]: django/django.git –

+0

Строка '' с git.custom_environment (GIT_SSH_COMMAND = git_ssh_cmd): '' ... что такое ** git **? Нет переменной или импорта, которая определяет git в фрагменте кода. –

Смежные вопросы