我在应用程序中克隆git存储库时遇到问题。
KEY_FILE = "/opt/app/.ssh/id_rsa"
def read_git_branch(config_id, branch):
config = RepoConfig.objects.get(id=config_id)
save_rsa_key(Credentials.objects.get(id=1).key)
git_ssh_identity_file = os.path.expanduser(KEY_FILE)
git_ssh_cmd = 'ssh -i %s' % git_ssh_identity_file
with Git().custom_environment(GIT_SSH_COMMAND=git_ssh_cmd):
with tempfile.TemporaryDirectory() as tmpdir:
repo = Repo.clone_from(config.url, tmpdir, branch=branch)
branch_obj, _ = Branch.objects.get_or_create(name=branch)
....
def save_rsa_key(key):
if not os.path.exists(os.path.dirname(KEY_FILE)):
try:
os.makedirs(os.path.dirname(KEY_FILE))
except OSError as exc:
if exc.errno != errno.EEXIST:
raise
with open(KEY_FILE, 'w') as id_rsa:
id_rsa.write(key)
os.chmod(KEY_FILE, 0o600)
预期结果是将存储库克隆到临时目录,对其执行某些操作并删除所有文件。相反,我得到:
DEBUG / ForkPoolWorker-2] AutoInterrupt等待标准错误:b'主机密钥验证失败。\ n致命:无法从远程存储库读取。\ n \ n请确保您具有正确的访问权限\ n并且该存储库已存在。\ n'
git.exc.GitCommandError:Cmd('git')失败,原因是:退出代码(128)cmdline:git clone --branch = master -v [email protected]:bar / project.git / tmp / tmpi_w2xhgtstderr:“主机密钥验证失败。
[当我尝试直接使用上面的代码使用以下代码创建的密钥文件从计算机直接连接到同一存储库时:
ssh-agent bash -c 'ssh-add /opt/app/.ssh/id_rsa; git clone [email protected]:bar/project.git'
克隆回购没有问题,并且主机已添加到known_hosts
。完成之后,我的代码将按预期工作...
必须是known_hosts
。任何人都有类似的问题吗?
感谢您的帮助。
with Git().custom_environment(GIT_SSH_COMMAND=git_ssh_cmd):
repo = Repo.clone_from(config.url, tmpdir, branch=branch)
→
git.Repo.clone_from(url, repo_dir, env={"GIT_SSH_COMMAND": 'ssh -i /PATH/TO/KEY'})
对我来说很好!