GitPython并将命令发送到Git对象

GitPython并将命令发送到Git对象,python,git,Python,Git,是从python与git交互的一种方式。我试图从这个模块访问基本的git命令(例如,git commit-m“message”),根据,应该通过git模块访问这些命令。以下是我迄今为止为使这些命令正常工作所做的努力: >>> import git >>> foo = git.Git("~/git/GitPython") >>> bar = "git commit -m 'message'" >>> beef = git.Gi

是从python与git交互的一种方式。我试图从这个模块访问基本的git命令(例如,
git commit-m“message”
),根据,应该通过git模块访问这些命令。以下是我迄今为止为使这些命令正常工作所做的努力:

>>> import git
>>> foo = git.Git("~/git/GitPython")
>>> bar = "git commit -m 'message'"
>>> beef = git.Git.execute(foo,bar)
这显示了一个错误,表示没有这样的文件或目录。我还尝试了以下作为git目录的路径:

~/git/GitPython/.git

/Users/bacon/git/gitclient/

唯一的其他选择是命令错误,因此我尝试:
commit-m“message”
,但仍然得到“没有这样的文件或目录”


要让这些git命令正常工作,我需要做什么?

在教程中说

The first step is to create a ``Repo`` object to represent your repository.

    >>> from git import *
    >>> repo = Repo("/Users/mtrier/Development/git-python")
我看不到你的回购协议


我正在查看GitPython的doc目录中名为tutorial.rst的文件。

我还没有尝试验证它,但git.git.execute似乎需要一个命令行参数列表(如果给它一个字符串,它将查找与字符串、空格和所有内容完全匹配的可执行文件,这自然不会找到),所以,我认为这样做是可行的:

import git
import os, os.path
g = git.Git(os.path.expanduser("~/git/GitPython"))
result = g.execute(["git", "commit", "-m", "'message'"])
其他变化:

  • 我认为使用带有~的路径是行不通的,所以我使用os.path.expanduser将~扩展到您的主目录
  • 通常首选使用instance.method(*args)而不是Class.method(instance,*args),因此我改变了这一点,尽管它仍然可以用另一种方式工作

可能有比手动运行commit命令更明智的方法(我只是没有注意到任何快速查看源代码的方法),因此我建议在这样做之前,确保没有更高级的方法

一般来说,~扩展是由shell完成的,不是文件系统的功能,所以你不应该指望它会起作用

os.path.expanduser可以为您应用扩展,但通常您最好写出完整的路径(从那时起,只要运行脚本的人能够访问您的文件,脚本就可以运行)

我怀疑你想要:

'/Users/bacon/git/GitPython'

尝试此操作后,我收到一条控制台消息:“git.errors.gitcomanderror:“[\'git'\,…]返回退出状态129”。感谢您将参数作为列表传递,非常有用:)最终使用['git''commit'、'-a'、'-m“message']使用此方法使其正常工作。再次感谢,你知道为什么文档不更清晰?或者“教程”实际上更像是教程?Python文档有时会令人沮丧。