使用gitPython比通过subprocess执行git命令有哪些优势?
我最近用Python写了一个git命令,这个命令是通过subprocess.Popen
来执行git命令的。现在我在考虑是否要使用gitPython
这个模块。使用gitPython
模块会有什么不同吗?
3 个回答
我觉得这个问题其实是一个更普遍的问题的具体版本,简单来说就是:“已经有我想要的东西了,我还需要从头开始自己写吗?”答案几乎总是“不需要”。
我还想说,对于在这个问题提出时(也就是2015年4月1.0.0版本发布之前)看过GitPython的人,建议你再去看看,这个项目最近进展很大。
GitPython是:
- 一个开源的社区项目
- 提供了一个Python风格的git接口
- 经过了充分的测试,有自动化的单元测试
- 被成百上千的人使用,这意味着发现bug的速度比你自己写的代码快得多
- 由真正懂git的人维护
- 是别人写的,这样你就可以专注于你想用git做的事情
- 对合并请求非常友好,如果你觉得缺少什么需要的功能,欢迎你来添加
- 采用BSD许可证,这样如果你的项目是给不太支持开源的公司用的,就不用担心GPL或其他更严格的版权问题
* 是的,有些情况下自己写东西是必要的,比如法律问题、办公室政治,或者是所谓的NIH综合症。我觉得这些情况都是例外。
对我来说,GitPython有很多优点。最重要的一点是,执行命令后得到的结果是Python对象,这样你就可以得到一个带有特定属性和方法的对象。这在遇到意外情况时,比如没有远程仓库,或者分支名称和你想的不一样时,会让你得到更好的结果。
repo = git.Repo('/home/user/my_project')
print(repo.branches)
由此,你可以像遍历远程仓库和分支的结果一样,轻松地处理这些结果。
for branch in repo.branches:
print(branch)
用原始命令行处理这些事情会变得非常麻烦。
而且,我认为GitPython对git功能的支持比gittle更全面,比如对子模块的支持。
使用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模块的使用经验?