如何使用带有 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 键在遥控器上操作的操作。
如果有人成功使用 GitPython 和 ssh 密钥,请分享,不胜感激。
我很乐意帮助粉碎当前文档,重新开始,首先使用最常见的用例,并预先添加 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密钥