从Python进行Git提交

14 投票
4 回答
41401 浏览
提问于 2025-04-16 23:56

我想用Python写一个模块(这是我的学习项目),来提升我使用git的体验。有没有什么Python模块可以用来执行各种git命令?至少是一些基本的命令,比如提交(commit)、差异(diff)、日志(log)和添加(add)?

我看到有一个叫GitPython的东西,但我找不到支持(新)提交的功能;它更像是一个浏览代码库的框架,而不是一个完整的GIT接口。(还是我漏掉什么了?)

另外,如果确实有一个Python模块可以做到这些,那用这个模块会更好,还是直接在Python代码中执行shell命令更方便呢?

4 个回答

10

Git的设计分为“管道”和“瓷器”两部分。“管道”是基础的低级系统,负责管理对象、仓库、远程等。而“瓷器”则是更友好的高级工具,它们利用了“管道”的功能。

历史上,只有最基本和性能关键的部分(主要是“管道”)是用C语言实现的,其余的部分则使用了shell或perl脚本。为了让代码更具可移植性,越来越多的代码被重写成C语言。

在这个背景下,我建议你在Python中调用git可执行文件的系统命令。可以把你的代码看作是Git的“瓷器”部分。相比于使用专门的库,使用系统调用有以下优缺点:

优点

  • 不需要学习新的API——可以直接使用你熟悉的git命令
  • 工具齐全——可以使用“瓷器”,不局限于低级功能

缺点

  • 需要解析git命令的命令行输出
  • 可能会比较慢
15

我觉得一些Python的源代码可以帮助像我这样的初学者,避免在查找文档上浪费宝贵的时间。

所有的提交都会发送到新创建的 origin master 分支上。

下面是代码:

from git import Repo
import os

path = '/your/path/here'
if not os.path.exists(path):
    os.makedirs(path)

os.chdir(path)

repo = Repo.init(path).git

index = Repo.init(path).index

for x in xrange (1,10):
    fname = 'filename' + str(x)
    f.open(fname, 'wb+')
    f.write()
    f.close()
    repo.add(fname)

index.commit("initial commit")
15

在GitPython中,你可以通过一个叫做索引对象的东西来创建一个提交。

而在libgit2中,你则是通过一个叫做仓库对象的东西来创建提交。

你可能还想看看这个问题:

撰写回答