Python Git Module体验?

PTB*_*BNL 167 python git

人们对Python的任何Git模块有什么经验?(我知道GitPython,PyGit和Dulwich - 如果你了解它们,请随时提及其他人.)

我正在编写一个程序,它必须与Git存储库进行交互(添加,删除,提交),但没有使用Git的经验,因此我正在寻找的一个方面是易于使用/理解Git.

我最感兴趣的其他事情是库的成熟度和完整性,合理的缺陷,持续开发以及文档和开发人员的乐于助人.

如果你想到我可能想要/需要知道的其他东西,请随意提及.

und*_*run 114

虽然这个问题刚才被问到,而且我当时并不知道库的状态,但值得一提的是,对于搜索者来说,GitPython可以很好地抽象命令行工具,这样你就不需要使用了子.您可以使用一些有用的内置抽象,但对于其他一切,您可以执行以下操作:

import git
repo = git.Repo( '/home/me/repodir' )
print repo.git.status()
# checkout and track a remote branch
print repo.git.checkout( 'origin/somebranch', b='somebranch' )
# add a file
print repo.git.add( 'somefile' )
# commit
print repo.git.commit( m='my commit message' )
# now we are one commit ahead
print repo.git.status()
Run Code Online (Sandbox Code Playgroud)

GitPython中的其他所有内容都使其更易于导航.我对这个库非常满意,并且感谢它是底层git工具的包装器.

更新:我已经切换到使用sh模块不仅仅是git,而是我在python中需要的大多数命令行实用程序.为了复制上面的内容,我会这样做:

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()
Run Code Online (Sandbox Code Playgroud)

  • 链接到sh:http://amoffat.github.io/sh/真的应该是python stdlib的一部分. (10认同)
  • 基于这个答案,我只是试着用git-python运气.我发现API处理起来很奇怪.大多数时候你必须回到repo.git.*通用界面,甚至有时候它不能正常工作(例如`repo.git.branch(b = somebranch)`有效但是`repo.git.branch (D = somebranch)`因为空间缺失所以没有).我想我会自己实现一个基于子进程的通用函数.我很伤心,我寄予厚望.: - / (8认同)
  • 我现在转而使用sh模块使用`git = sh.git.bake(_cwd = repopath)`.它的工作非常棒. (6认同)
  • 最新的python sh版本在Windows上不起作用.完全彻底失败. (4认同)
  • 来自 GitPython 自述文件:“GitPython 不适合长时间运行的进程(如守护进程),因为它容易泄漏系统资源。” (3认同)
  • 优秀的Legit工具使用GitPython:https://github.com/kennethreitz/legit/blob/develop/legit/scm.py (2认同)
  • 与“subprocess”相比,“sh”有哪些优点? (2认同)

PTB*_*BNL 73

我想我会回答我自己的问题,因为我采取的路径与答案中提出的路径不同.尽管如此,感谢那些回答的人.

首先,简要介绍一下我使用GitPython,PyGit和Dulwich的经历:

  • GitPython:下载后,我导入了这个并初始化了相应的对象.但是,尝试执行教程中建议的操作会导致错误.由于缺乏更多文档,我转向其他地方.
  • PyGit:这甚至不会导入,我找不到文档.
  • 德威:似乎是最有希望的(至少我想要和看到的).我用它做了一些进步,比GitPython更进一步,因为它的蛋有Python源.然而,过了一段时间,我觉得可能更容易尝试我做的事情.

此外,StGit看起来很有趣,但我需要将功能提取到一个单独的模块中,并且不希望等待它立即发生.

在(尝试使上述三个模块工作的时间)上,我设法通过子进程模块获得git命令,例如,

def gitAdd(fileName, repoDir):
    cmd = ['git', 'add', fileName]
    p = subprocess.Popen(cmd, cwd=repoDir)
    p.wait()

gitAdd('exampleFile.txt', '/usr/local/example_git_repo_dir')
Run Code Online (Sandbox Code Playgroud)

这还没有完全融入到我的程序中,但我没有预料到问题,除了速度(因为我有时会处理数百甚至数千个文件).

也许我只是没有耐心去Dulwich或GitPython.也就是说,我希望这些模块能够获得更多的开发并且很快就会变得更有用.

  • 这个答案正在变老. (20认同)
  • @Arthur,我不同意,因为我至少花了 3 个小时研究 StackOverflow 和 GitPython 文档,只是为了了解 git pull、add、commit 和使用它推送到远程存储库的基础知识。该文档确实有一些高级用例,但缺乏非常基础的用例。我基本上放弃并使用子流程。 (4认同)
  • 是的,我对更新感兴趣. (3认同)

小智 30

我推荐pygit2 - 它使用了优秀的libgit2绑定

  • 就像现在一样,必须手动下载并编译/设置`libgit`和`pygit2`的半稳定版本,从GitHub获取源代码.问题是,头部分支已经破坏了测试,并且最新的"稳定"失败安装......如果可靠性很重要并且您需要在各种环境中部署,那么这不是一个合适的解决方案...... :( (2认同)
  • 请注意,他们不支持cygwin,因为[他们的重点是Windows原生支持](https://github.com/libgit2/libgit2/issues/476#issuecomment-2697761)。因此,尽管在cygwin上不支持libgit2是正确的,但这*并非*意味着Windows用户被冷落了。 (2认同)

gak*_*gak 20

这是一个非常古老的问题,在寻找Git库的过程中,我发现今年(2013年)创建了一个名为Gittle的库.

它对我很有用(我试过的其他人都很脆弱),似乎涵盖了大多数常见的动作.

README中的一些示例:

from gittle import Gittle

# Clone a repository
repo_path = '/tmp/gittle_bare'
repo_url = 'git://github.com/FriendCode/gittle.git'
repo = Gittle.clone(repo_url, repo_path)

# Stage multiple files
repo.stage(['other1.txt', 'other2.txt'])

# Do the commit
repo.commit(name="Samy Pesse", email="samy@friendco.de", message="This is a commit")

# Authentication with RSA private key
key_file = open('/Users/Me/keys/rsa/private_rsa')
repo.auth(pkey=key_file)

# Do push
repo.push()
Run Code Online (Sandbox Code Playgroud)

  • @underrun添加是向舞台添加文件.与暂存文件不一样吗? (3认同)
  • 我不喜欢您“登台”文件,而不是“添加”文件到索引。更改常用/重要操作的名称似乎很令人困惑。 (2认同)

ton*_*nfa 17

也许它有所帮助,但是Bazaar和Mercurial都在使用dulwich来实现他们的Git互操作性.

德威可能与另一个不同,因为它是python中git的重新实现.另一个可能只是Git命令的包装器(所以从高级别的角度来看它可能更简单:commit/add/delete),这可能意味着他们的API非常接近git的命令行,所以你需要获得Git的经验.


Jon*_*Chu 7

反映更改时间的更新答案:

GitPython目前最容易使用.它支持包装许多git管道命令,并且具有可插入的对象数据库(dulwich是其中之一),如果没有实现命令,则提供一个简单的api用于shell命令到命令行.例如:

repo = Repo('.')
repo.checkout(b='new_branch')
Run Code Online (Sandbox Code Playgroud)

这叫:

bash$ git checkout -b new_branch
Run Code Online (Sandbox Code Playgroud)

德威也很好,但水平要低得多.使用它有点痛苦,因为它需要在管道级别上操作git对象,并且没有你通常想做的漂亮的瓷器.但是,如果您计划修改git的任何部分,或使用git-receive-pack和git-upload-pack,则需要使用dulwich.


Jus*_*hms 6

为了完整起见,http://github.com/alex/pyvcs/是所有dvcs的抽象层.它使用dulwich,但提供与其他dvcs的互操作.