使用gitPython比通过subprocess执行git命令有哪些优势?

2 投票
3 回答
2420 浏览
提问于 2025-04-17 21:25

我最近用Python写了一个git命令,这个命令是通过subprocess.Popen来执行git命令的。现在我在考虑是否要使用gitPython这个模块。使用gitPython模块会有什么不同吗?

3 个回答

1

我觉得这个问题其实是一个更普遍的问题的具体版本,简单来说就是:“已经有我想要的东西了,我还需要从头开始自己写吗?”答案几乎总是“不需要”。

我还想说,对于在这个问题提出时(也就是2015年4月1.0.0版本发布之前)看过GitPython的人,建议你再去看看,这个项目最近进展很大。

GitPython是:

  • 一个开源的社区项目
  • 提供了一个Python风格的git接口
  • 经过了充分的测试,有自动化的单元测试
  • 被成百上千的人使用,这意味着发现bug的速度比你自己写的代码快得多
  • 由真正懂git的人维护
  • 是别人写的,这样你就可以专注于你想用git做的事情
  • 对合并请求非常友好,如果你觉得缺少什么需要的功能,欢迎你来添加
  • 采用BSD许可证,这样如果你的项目是给不太支持开源的公司用的,就不用担心GPL或其他更严格的版权问题

* 是的,有些情况下自己写东西是必要的,比如法律问题、办公室政治,或者是所谓的NIH综合症。我觉得这些情况都是例外。

2

对我来说,GitPython有很多优点。最重要的一点是,执行命令后得到的结果是Python对象,这样你就可以得到一个带有特定属性和方法的对象。这在遇到意外情况时,比如没有远程仓库,或者分支名称和你想的不一样时,会让你得到更好的结果。

repo = git.Repo('/home/user/my_project')
print(repo.branches)

由此,你可以像遍历远程仓库和分支的结果一样,轻松地处理这些结果。

for branch in repo.branches:
    print(branch)

用原始命令行处理这些事情会变得非常麻烦。

而且,我认为GitPython对git功能的支持比gittle更全面,比如对子模块的支持。

2

使用subprocess模块会更容易上手。相比之下,搞定gitPython可能需要花更多时间。根据你的项目需求,直接用subprocess可能会更简单。如果你打算走subprocess这条路,可以看看sh这个工具。http://amoffat.github.io/sh/ sh让你可以像调用函数一样调用程序。此外,你有没有关注过https://github.com/FriendCode/gittle - 如果你只是想自动化一些Git命令,这个工具可能会很不错。

例如:

import sh
git = sh.git.bake(_cwd='/home/me/repodir')
print git.status()
# checkout and track a remote branch
print git.checkout('-b', 'somebranch')
# add a file
print git.add('somefile')
# commit
print git.commit(m='my commit message')
# now we are one commit ahead
print git.status()

更多信息:Python Git模块的使用经验?

撰写回答