特定のSSHキーとともにGitPythonを使用するにはどうすればよいですか?
ドキュメントはそのテーマについては完全ではありません。これまでに試したのはRepo(path)
だけです。
以下のすべてが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の新機能)の詳細については、 それぞれの問題 を参照してください。
以下は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')
これは、シェル自体で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認証を実行します。
シムスクリプトは必要ありません。
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'})
_
私は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