如何使用带有 ssh 密钥的 GitPython?

Posted

技术标签:

【中文标题】如何使用带有 ssh 密钥的 GitPython?【英文标题】:How do I use GitPython with a ssh key? 【发布时间】:2021-03-21 08:12:00 【问题描述】:

我想创建一个简短的 git 工作流,使用 git 的 python 库 (GitPython) 做一些事情。

如果有人成功地使用带有 ssh 密钥的 GitPython 来做一些基本的事情,比如 git pull,请发帖。

遵循文档不起作用。


文档非常混乱,它直接跳转到我怀疑任何人、任何地方都会使用的***用例,并在使用诸如 repo.function() 之类的调用之间来回切换并且 git.function() 令人困惑。


我只需要做一些简单的日常事情:pull、add、commit、push、merge 等,但我真的很难通过文档来寻找如何做最常见的事情 -我希望出现在任何文档的最前面的项目。

此外,我不明白为什么有人会使用 GitPython 来自动化操作,然后在每次访问托管存储库时暂停以输入他们的凭据。这些人是谁?

最常见的用例是执行拉/推等操作,任何使用 ssh 键在遥控器上操作的操作。

如果有人成功使用 GitPythonssh 密钥,请分享,不胜感激。


我很乐意帮助粉碎当前文档,重新开始,首先使用最常见的用例,并预先添加 ssh 密钥使用功能,但我需要首先收集所有这些信息并构建一个库参与之前的简单功能(我会 - 它需要完成)。

【问题讨论】:

我相信 GitPython 只是 Git 的一个包装器。在 GitPython 中使用 ssh 密钥应该与在 Git 中使用没有什么不同。搜索会在 how to specify a specific ssh key 上找到说明,但这不是必需的。 这不起作用,我无法获得 ssh 密钥来使用 GitPython。也许它只是没有实现。 应该没有什么要实现的。它是如何“不工作”的?请在答案中编辑详细信息。 【参考方案1】:

GitPython 只是 Git 可执行文件的包装器。在 GitPython 中使用 ssh 密钥是 the same as using one with Git itself。

这是一个演示。我已经从我的 ssh 代理中删除了我的 ssh 密钥。

>>> from git import Repo
>>> repo = Repo("/Users/schwern/devel/ruby")
>>> origin = repo.remote("origin")
>>> for fetch_info in origin.fetch():
...     print("Updated %s to %s" % (fetch_info.ref, fetch_info.commit))
... ^D
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/opt/local/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/git/remote.py", line 797, in fetch
    res = self._get_fetch_info_from_stderr(proc, progress)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/git/remote.py", line 676, in _get_fetch_info_from_stderr
    proc.wait(stderr=stderr_text)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/git/cmd.py", line 408, in wait
    raise GitCommandError(self.args, status, errstr)
git.exc.GitCommandError: Cmd('git') failed due to: exit code(128)
  cmdline: git fetch -v origin
  stderr: 'fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.'

如您所见,它只是调用git fetch -v origin。如果我运行git fetch -v origin,我会得到同样的错误。

$ git fetch -v origin
git@github.com: Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

一旦我添加了我的 ssh 密钥,origin.fetch() 就会成功。

>>> for fetch_info in origin.fetch():
...     print("Updated %s to %s" % (fetch_info.ref, fetch_info.commit))
... ^D
Updated origin/master to 7a3322a0fd660d676f1918bd7c4a37676b44e1c2
...etc...

确保git fetch 有效。然后 GitPython 应该可以工作了。

【讨论】:

以上是关于如何使用带有 ssh 密钥的 GitPython?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用带有密码的 SSH 密钥身份验证“去获取”私有存储库

sh 使用ProFTPd(带有SFTP模块)为密钥验证设置SSH密钥

带有密钥+密码的lftp [关闭]

如何删除 SSH 密钥?

带有 openssh 密钥的 TortoiseGit 未使用 ssh-agent 进行身份验证

如何将节点特定的 SSH 密钥与 Rundeck AWS EC2 资源插件一起使用?