GitPython与向Git对象发送命令

8 投票
4 回答
9521 浏览
提问于 2025-04-15 11:38

GitPython 是一个可以让你用 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 命令正常工作呢?

4 个回答

0

在教程里说...

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

    >>> from git import *
    >>> repo = Repo("/Users/mtrier/Development/git-python")

我没有看到你的代码库。

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

0

一般来说,~ 这个符号的扩展是由你的命令行工具(也就是“shell”)来完成的,而不是文件系统的功能,所以你不应该指望它能正常工作。

os.path.expanduser 这个函数可以帮你进行扩展,但通常来说,写出完整的路径会更好(这样无论谁运行这个脚本,只要他们有权限访问你的文件,就能正常工作)。

我猜你想要的是:

'/Users/bacon/git/GitPython'
20

我还没验证过,但看起来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来把~扩展成你的主目录
  • 一般来说,使用实例.方法(*args)比类.方法(实例, *args)更受欢迎,所以我做了这个改动,不过用另一种方式也能工作

不过,可能还有比手动运行提交命令更好的方法(我在快速浏览源码时没注意到),所以我建议在这样做之前,先确认一下有没有更高级的方法。

撰写回答