人们对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)
PTB*_*BNL 73
我想我会回答我自己的问题,因为我采取的路径与答案中提出的路径不同.尽管如此,感谢那些回答的人.
首先,简要介绍一下我使用GitPython,PyGit和Dulwich的经历:
此外,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.也就是说,我希望这些模块能够获得更多的开发并且很快就会变得更有用.
小智 30
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)
ton*_*nfa 17
也许它有所帮助,但是Bazaar和Mercurial都在使用dulwich来实现他们的Git互操作性.
德威可能与另一个不同,因为它是python中git的重新实现.另一个可能只是Git命令的包装器(所以从高级别的角度来看它可能更简单:commit/add/delete),这可能意味着他们的API非常接近git的命令行,所以你需要获得Git的经验.
反映更改时间的更新答案:
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.
| 归档时间: |
|
| 查看次数: |
94091 次 |
| 最近记录: |