web-dev-qa-db-ja.com

GitPythonとSSHキー?

特定のSSHキーとともにGitPythonを使用するにはどうすればよいですか?

ドキュメントはそのテーマについては完全ではありません。これまでに試したのはRepo(path)だけです。

18
andreihondrari

以下のすべてがGitPython v0.3.6以降でのみ機能することに注意してください。

_GIT_SSH_環境変数を使用して、代わりにsshを呼び出す実行可能ファイルをgitに提供できます。そうすれば、gitが接続しようとするときはいつでも、あらゆる種類のsshキーを使用できます。

これは、コールごとに コンテキストマネージャ ...を使用して機能します。

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

...または、リポジトリのGitオブジェクトの set_environment(...) メソッドを永続的に使用します。

_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の新機能)の詳細については、 それぞれの問題 を参照してください。

9
Byron

以下は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('git@....', '/path', branch='my-branch')
11
Vijay Katam

これは、シェル自体でgitが動作する方法に少し似たものになることがわかりました。

import os
from git import Git, Repo

global_git = Git()
global_git.update_environment(
    **{ k: os.environ[k] for k in os.environ if k.startswith('SSH') }
)

基本的には、SSH環境変数をGitPythonの「シャドウ」環境にコピーしています。次に、一般的なSSH-AGENT認証メカニズムを使用するため、どのキーであるかを正確に指定する必要はありません。

おそらくそれで多くの粗末を運ぶより速い代替案のために、それはあまりにも機能します:

import os
from git import Git

global_git = Git()
global_git.update_environment(**os.environ)

これは、bashでサブシェルが機能する方法に似た、環境全体を反映しています。

どちらの方法でも、リポジトリまたはクローンを作成するための今後の呼び出しは、「調整済み」環境を取得し、標準のgit認証を実行します。

シムスクリプトは必要ありません。

3
mjn

GitPythonの_clone_from_の場合、Vijayの回答が機能しません。 git sshコマンドを新しいGit()インスタンスに設定しますが、別のRepo呼び出しをインスタンス化します。機能するのは、私が here から学んだように、_clone_from_のenv引数を使用することです。

_Repo.clone_from(url, repo_dir, env={"GIT_SSH_COMMAND": 'ssh -i /PATH/TO/KEY'})
_
2
shadi

私はGitPython == 3.0.5を使用しており、以下がうまくいきました。

from git import Repo
from git import Git    
git_ssh_identity_file = os.path.join(os.getcwd(),'ssh_key.key')
git_ssh_cmd = 'ssh -i %s' % git_ssh_identity_file
Repo.clone_from(repo_url, os.path.join(os.getcwd(), repo_name),env=dict(GIT_SSH_COMMAND=git_ssh_cmd))

Repo.git.custom_environmentを使用してGIT_SSH_COMMANDを設定すると、clone_from関数では機能しません。リファレンス: https://github.com/gitpython-developers/GitPython/issues/339

2
3lokh