GitPython 和 SSH 密钥?
GitPython and SSH Keys?
如何将 GitPython 与特定的 SSH 密钥一起使用?
关于该主题的文档不是很详尽。到目前为止我唯一尝试过的是 Repo(path)
.
请注意,以下所有内容仅适用于 GitPython v0.3.6 或更新版本。
您可以使用 GIT_SSH
环境变量为 git 提供一个可执行文件,它将在其位置调用 ssh
。这样,每当 git 尝试连接时,您都可以使用任何类型的 ssh 密钥。
每次调用都可以使用 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()
... 或更持久地使用存储库 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 中的新功能),您会发现 in the respective issue。
以下在 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 本身在 shell 中的工作方式。
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 的 "shadow" 环境。然后它使用常见的 SSH-AGENT 身份验证机制,因此您不必担心具体指定它是哪个密钥。
对于一个更快的替代方案,它可能带有很多麻烦,但它也有效:
import os
from git import Git
global_git = Git()
global_git.update_environment(**os.environ)
这反映了您的整个环境,更像是 subshell 在 bash 中的工作方式。
无论哪种方式,任何未来创建回购或克隆的调用都会选择 'adjusted' 环境并进行标准 git 身份验证。
无需 shim 脚本。
对于 GitPython 中的 clone_from
,Vijay 的回答无效。它在新的 Git()
实例中设置 git ssh 命令,然后实例化一个单独的 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
使用 Windows 请注意引号的位置。假设你有
git.Repo.clone_from(bb_url, working_dir, env={"GIT_SSH_COMMAND": git_ssh_cmd})
然后这有效:
git_ssh_cmd = f'ssh -p 6022 -i "C:\Users\mwb\.ssh\id_rsa_mock"'
但这不是:
git_ssh_cmd = f'ssh -p 6022 -i C:\Users\mwb\.ssh\id_rsa_mock'
原因:
如何将 GitPython 与特定的 SSH 密钥一起使用?
关于该主题的文档不是很详尽。到目前为止我唯一尝试过的是 Repo(path)
.
请注意,以下所有内容仅适用于 GitPython v0.3.6 或更新版本。
您可以使用 GIT_SSH
环境变量为 git 提供一个可执行文件,它将在其位置调用 ssh
。这样,每当 git 尝试连接时,您都可以使用任何类型的 ssh 密钥。
每次调用都可以使用 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()
... 或更持久地使用存储库 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 中的新功能),您会发现 in the respective issue。
以下在 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 本身在 shell 中的工作方式。
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 的 "shadow" 环境。然后它使用常见的 SSH-AGENT 身份验证机制,因此您不必担心具体指定它是哪个密钥。
对于一个更快的替代方案,它可能带有很多麻烦,但它也有效:
import os
from git import Git
global_git = Git()
global_git.update_environment(**os.environ)
这反映了您的整个环境,更像是 subshell 在 bash 中的工作方式。
无论哪种方式,任何未来创建回购或克隆的调用都会选择 'adjusted' 环境并进行标准 git 身份验证。
无需 shim 脚本。
对于 GitPython 中的 clone_from
,Vijay 的回答无效。它在新的 Git()
实例中设置 git ssh 命令,然后实例化一个单独的 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
使用 Windows 请注意引号的位置。假设你有
git.Repo.clone_from(bb_url, working_dir, env={"GIT_SSH_COMMAND": git_ssh_cmd})
然后这有效:
git_ssh_cmd = f'ssh -p 6022 -i "C:\Users\mwb\.ssh\id_rsa_mock"'
但这不是:
git_ssh_cmd = f'ssh -p 6022 -i C:\Users\mwb\.ssh\id_rsa_mock'
原因: