`
scm002
  • 浏览: 317046 次
社区版块
存档分类
最新评论

GitPython 库

 
阅读更多

GitPython is a python library used to interact with git repositories. It provides abstractions of git objects for easy access of repository data, and additionally allows you to access the git repository more directly using either a pure python implementation, or the faster, but more resource intensive git command implementation.

安装:

reference http://packages.python.org/GitPython/0.3.1/intro.html

1、 GitDB

2、 async

3、smmap

由于使用easy_install GitPython失败,于是使用 sudo python setup.py install 来安装,本人机器上的版本如下,:

  1. async-0.6.1.tar.gz   
  2. smmap-0.8.2.tar.gz  
  3. gitdb-0.5.4.tar.gz   
  4. GitPython-0.3.1-beta2.tar.gz 

命令简介:

  1. ####head
  2. >>> from git import * 
  3. >>> repo = Repo.init("/home/test/.git") 
  4. >>> repo.heads 
  5. [<git.Head "refs/heads/rt24-build">
  6. >>> repo.heads[0]
    <git.Head "refs/heads/rt24-build">
  7. >>> repo.head
    <git.HEAD "HEAD">
  8. >>> repo.head.reference
    <git.Head "refs/heads/rt24-build">

 

  1. ####commit
  2. >>> repo.head.commit
    <git.Commit "4500d8151fcdd93087cb599544120ead6f943aa7">
  3. >>> repo.commit('rt24-build')
    <git.Commit "4500d8151fcdd93087cb599544120ead6f943aa7">
  4. >>> repo.commit('HEAD~')
    <git.Commit "04b49ab467ad96bd9c9c7844495b80d1959e716b">
  5. >>> repo.head.commit.parents
    (<git.Commit "04b49ab467ad96bd9c9c7844495b80d1959e716b">,)
  6. >>> repo.head.commit.parents[0]
    <git.Commit "04b49ab467ad96bd9c9c7844495b80d1959e716b">
    >>> repo.head.commit.parents[0].parents[0]
    <git.Commit "aa1b8964c4ec1f994e1b54b1a223db005cb90b16">
  7. >>> repo.commit('HEAD~').parents
    (<git.Commit "aa1b8964c4ec1f994e1b54b1a223db005cb90b16">,)
  1. #from http://packages.python.org/GitPython/0.3.1/tutorial.html
  2. headcommit = repo.head.commit 
  3.  
  4. headcommit.hexsha 
  5. '207c0c4418115df0d30820ab1a9acd2ea4bf4431' 
  6.  
  7. headcommit.parents 
  8. (<git.Commit "a91c45eee0b41bf3cdaad3418ca3850664c4a4b4">,) 
  9.  
  10. headcommit.tree 
  11. <git.Tree "563413aedbeda425d8d9dcbb744247d0c3e8a0ac"> 
  12.  
  13. headcommit.author 
  14. <git.Actor "Michael Trier <mtrier@gmail.com>"> 
  15.  
  16. headcommit.authored_date        # seconds since epoch 
  17. 1256291446 
  18.  
  19. headcommit.committer 
  20. <git.Actor "Michael Trier <mtrier@gmail.com>"> 
  21.  
  22. headcommit.committed_date 
  23. 1256291446 
  24.  
  25. headcommit.message 
  26. 'cleaned up a lot of test information. Fixed escaping so it works with 
  27. subprocess.' 
  1. ####tree 
  2. >>> tree = repo.head.commit.tree 
  3. >>> tree 
  4. <git.Tree "94cdc2be1511d765f9bc2fb05c85bda9e729d902"> 
  5. >>> tree.trees 
  6. [<git.Tree "780675fdf24f573f4d11682d804a68422215f345">
  7. <git.Tree "5844c84155668a2a34c5ce735433e66926904064">
  8. <git.Tree "b0e3ec09efc8ec093d4d37c3fa833464d29851a2">
  9. <git.Tree "0fc969b876f0bdbfb8d24dfaa28b5dd604487813">
  10. <git.Tree "4a801fd4d8874efc7422b65b46ec5446d08269a7">
  11. <git.Tree "22907f24d136e4a8a3f0d6dea74658b222fa4885">
  12. >>> tree[0].name 
  13. '.gitignore' 
  14. >>> tree[0].path 
  15. '.gitignore' 
  16. >>> tree[0].abspath 
  17. '/home/test/.gitignore' 

关于tree:是repo的目录结构,git show 94cdc2be1511d765f9bc2fb05c85bda9e729d902 能显示该目录下的所以目录和文件,每一个目录需要一个tree,从tree.trees的输出有6项知道,该目录下有6个目录。可以对这6个目录分别递归显示其下的目录和文件。

 直接使用git命令:

 GitPython源代码cmd.py文件中 Git::_call_process 函数提供直接使用git命令接口。

  1. >>> print repo.git.show('4500d8151fcd') 
  2. commit 4500d8151fcdd93087cb599544120ead6f943aa7 ......
  3. >>> repo.git.log('-1') 
  4. 'commit 6cba56e7816dd8a7dc591bd097e8e51c5d631679\nAuthor:......' 

 

python setup.py install 来安装python包,如何卸载呢?

只能手动删除安装的文件,可以使用如下命令

python setup.py install --record files.txt 记录安装后文件的路径

cat files.txt | xargs rm -rf  删除这些文件

另外sudo apt-get install python-git也能安装,但是接口会有很大的不一样,例如:

前者安装的

  1. >>> dir(git.Repo) 
  2. ['DAEMON_EXPORT_FILE', '__class__', '__delattr__', '__doc__', '__eq__', '__format__',  
  3. '__getattribute__', '__hash__', '__init__', '__module__', '__ne__', '__new__', '__reduce__',  
  4. '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__slots__', '__str__',  
  5. '__subclasshook__', '_bare', '_clone', '_get_alternates', '_get_config_path',  
  6. '_set_alternates', '_working_tree_dir', 'active_branch', 'alternates', 'archive', 'bare', 
  7.  'blame', 'branches', 'clone', 'clone_from', 'commit', 'config_level', 'config_reader',  
  8. 'config_writer', 'create_head', 'create_remote', 'create_submodule', 'create_tag', 'daemon_export', 
  9.  'delete_head', 'delete_remote', 'delete_tag', 'description', 'git', 'git_dir', 'head', 'heads',  
  10. 'index', 'init', 'is_dirty', 'iter_commits', 'iter_submodules', 'iter_trees', 'odb',  
  11. 're_author_committer_start', 're_hexsha_only', 're_hexsha_shortened', 're_tab_full_line',  
  12. 're_whitespace', 'references', 'refs', 'remote', 'remotes', 'rev_parse', 'submodule',  
  13. 'submodule_update', 'submodules', 'tag', 'tags', 'tree', 'untracked_files', 'working_dir',  
  14. 'working_tree_dir'] 

apt 安装的是 python-git 0.1.6-1

  1. >>> dir(git.Repo) 
  2. ['DAEMON_EXPORT_FILE', '__class__', '__delattr__', '__dict__', '__doc__', '__format__',  
  3. '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__',  
  4. '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__',  
  5. '__weakref__', '_get_alternates', '_set_alternates', 'active_branch', 'alternates', 'archive_tar',  
  6. 'archive_tar_gz', 'blob', 'branches', 'commit', 'commit_count', 'commit_deltas_from', 'commit_diff',  
  7. 'commits', 'commits_between', 'commits_since', 'create', 'daemon_export', 'description', 'diff', 
  8.  'fork_bare', 'heads', 'init_bare', 'is_dirty', 'log', 'tags', 'tree'] 

 

本文出自 “每日C” 博客,请务必保留此出处http://dailyc.blog.51cto.com/6187762/1064033

 

GitPython git python 的开发库

https://my.oschina.net/hopeMan/blog/141221

工程地址: https://pypi.python.org/pypi/GitPython/ 需要安装先安装: gitdb https://pypi.python.org/pypi/gitdbGitPython使用模块对象访问git配置库。 仓库操作 初始仓库对象 from git import * repo = Repo(repo_path) assert repo.bare == False

创建裸库
    repo = Repo.init(repo_path,bare=True)
    assert repo.bare == True

仓库数据高层接口可以新增/删除 heads/tags/remotes和访问仓库的配置信息
    repo.config_reader() #获得仓库中只读的配置信息
    repo.config_writer() #更新仓库中的配置信息

获取活动分支、未被管理的文件和判断是否有变更
    repo.is_dirty()  #返回布尔值
    repo.untracked_files    #返回未被管理的文件列表

克隆和初始化一个新的仓库
    cloned_repo = repo.clone(to/this/path)
    new_repo = repo.init(path/for/new/repo)

数据库对象 repo对象的性能优于数据库对象,repo对象一般用于获取大数据和新增对象。

GitDB 在操作大文件时,GitDB可以使用更少的内存,但处理速度慢2到5倍 repo = Repo('path/to/repo',odbt=GitDB)

GitCmdObjectDB 使用git-cat-file实例读取配置库信息,访问速度比较快,但内存占用比GitDB严重。 repo = Repo('path/to/repo',odbt=GitCmdObjectDB)

引用操作的实例 head操作 heads = repo.heads master = heads.master #lists can be accessed by name for convenience master.commit #the commit pointed to by head called master master.rename('new_name') #rename heads tag(tag通常是不变的)是一个commit或tag对象的引用 tags = repo.tags tagref = tags[0] #tag可以有一个tag对象,存储额外的信息 tagref.commit #tag总是指向一个commit repo.delete_tag(tagref) #删除一个tag repo.create_tag('my_tag') #创建一个tag 符号引用可以替代具体commit指向一个引用 head = repo.head #the head points to the active branch/ref master = head.reference #but they always point to commits master.commit #from here you use it as any other reference

访问reflog
    log = master.log()
    log[0]  #first reflog entry
    log[-1] #last reflog entry
修改引用
    创建、删除各种引用和修改指向
    repo.delete_head('master') #delete an existing head
    master = repo.create_head('master')  #create a new one
    master.commit = 'HEAD~10'   #set branch to another commit without changing index or working tree
    创建、删除tags
    new_tag = repo.create_tag('my_tag','my message')
    repo.delete_tag(new_tag)
    分支直接切换
    new_branch = repo.craete_head('new_branch')
    repo.head.reference = new_branch

git库的各种对象
    git的所有对象都存在git数据库中。对象包含的信息有类型、未压缩的大小、每个对象都有一个20个字节的唯一的SHA1值。
    git有四类对象Blobs、Trees、Commits and Tags
    git所有的对象都可以访问,但通常是通过引用或git仓库的方法来访问,不是直接从数据库中读取。
        hc = repo.head.commit
        hct = hc.tree
        hc != hct
        hc != repo.tags[0]
        hc == repo.head.reference.commit
    git对象基本字段有
        hct.type
        hct.size
        hct.hexsha
        hct.binsha
    索引对象可以用作git的索引,这些对象是Trees/Blobs和Submodules ,这些对象含有文件路径的信息。
        hct.path    #root tree has no path
        hct.trees[0].path #the first subdirectory has one though
        hct.mode    #trees have the mode of a linux directory
        hct.blobs[0].mode #blobs have a specific mode though compareable to a standard linux fs
    使用stream访问blob数据或者其他对象数据   
        hct.blobs[0].data_stream.read() #stream object to read data from 
        hct.blobs[0].stream_data(open("blob_data","w")) #write data to given stream

Commit对象
    commit对象包含固定commit的信息。通过引用或者指定版本可以获取到commit对象
        repo.commit('master')
        repo.commit('v0.1')
        repo.commit('HEAD~10')
    获取100指定引用上100commit
        repo.iter_commits('master',max_count=100)
    分页显示
        显示21-30的记录
        repo.iter_commits('master',max_count=10,skip=20)

        headcommit = repo.head.commit
        headcommit.hexsha
        headcommit.parents
        headcommit.author
        headcommit.tree
        headcommit.committer
        headcommit.committed_date
        headcommit.message
    时间格式化
        import time
        time.asctime(time.gmtime(headcommit.committed_date))  #'Web May 7 05:56:02 2013'
        tiem.strftime("%a,%d %b %Y %H:%M",time.gmtime(headcommit.committed_date)) #'Web,7 May 2013 05:56'
    访问commit祖先
        headcommit.parents[0].parents[0].parents[0].parents[0]
        等价于master^^^^ 或者master~4

Tree对象
    tree对象指向当前目录的内容。获取master分支最新提交的根tree对象
        tree = repo.heads.master.commit.tree
    通过tree对象可以获取的内容有
        tree.trees  #trees are subdirectories
        tree.blobs  #blobs are files
    可以通过名称获取tree对象
        tree[0] = tree['dir']  #access by index and by sub-path
        blob = tree[0][0]
        blob.name
        blob.path
        blob.abspath
    有简便的方法通过子目录名称就可以获取对象
        tree/"lib"
        tree/"dir/file" == blob
    如果指定tree对象的名称也可以直接从git数据库中读取
        repo.tree() #返回<git.Tree "master">
        repo.tree("c1c7214dde86...")
        repo.tree('0.1.6')
    遍历tree对象
        tree.traverse()
        for entry in tree.traverse():do_something_with(entry)
    如果tree对象返回的是子模块对象,默认为是当前head的commit

索引对象
    git的索引对象包含了commit变更和合并信息。通过索引对象可以获得更复杂的信息
        index = repo.index
    读取、添加、删除实例,Commit变更:
        for stage,blob in index.iter_blobs():do_something(...)  #Access blob object
        for (path,stage),entry in index.entries.iteritems: pass #Access the entries directly
        index.add(['my_new_file'])   #add a new file to the index
        index.remove(['dir/existing_file'])
        new_commit = index.commit("my commit message")
     通过tree或者merge创建新索引
        tmp_index = Index.from_tree(repo,'HEAD~1') #load a tree into a temporary index
        merge_index = Index.from_tree(repo,'base','HEAD','some_branch') #merge two trees three-way
        merge_index.write('merged_index')
远程仓库
    远程名称作为外部从仓库的别名,可以通过它push和fetch数据
        test_remote = repo.create_remote('test','git@server:repo.git')
        repo.delete_remote(test_remote) # create and delete remotes
        origin = repo.remotes.origin #get default remote by name
        origin.refs  #local remote reference
        o = origin.rename('new_origin') #rename remotes
        o.fetch()   #fetch,pull and push from and to the remote 
        o.pull()
        o.push()
    远程库的配置信息
        o.url
    修改配置信息
        o.config_writer.set('pushurl','other_url')
子模块

对象比较
    可以比较index和Trees或者Index和working tree 或者trees和trees以及trees和working copy 
        hcommit = repo.head.commit
        idiff = hcommit.diff()  #diff tree against index
        tdiff = hcommit.diff('HEAD~1')  #diff tree against previous tree
        wdiff = hcommit.diff(None)  #diff tree against working tree

        index = repo.index
        index.diff() #diff index agginst itself yielding empty idff
        index.diff(None) #diff index against working copy
        index.diff('HEAD') #diff index against current HEAD tree
    比较返回的比较索引本质上是一个Diff对象列表,通过额外的过滤方法你可以找到你想要的内容
    for diff_added in wdiff.iter_change_type('A'): do_something_with(diff_added)

分支切换
    想切换分支,你需要设置HEAD指向新分支,重置index和工作区
        repo.head.reference = repo.heads.other_branch
        repo.head.reset(index=True,working_tree=True)
    上面的方法会覆盖掉工作区中所有修改未提交的边更新,下面的方法则不会
        repo.heads.master.checkout() #checkout the branch using git-checkout 
        repo.heads.other_branch.checkout()
直接使用git库
    通过git实例使用git命令
        git = repo.git
        git.checkout('head',b='my_new_branch')  #default command
        git.for_each_ref()  #'-' becomes '_' when calling it
分享到:
评论

相关推荐

    PyPI 官网下载 | GitPython-2.1.14.tar.gz

    GitPython库的设计理念是提供一种直观且面向对象的方式来操作Git仓库,使得对Git的操作就像处理Python对象一样简单。它通过封装Git的命令行工具,提供了高级接口,可以实现自动化工作流程,对于开发者来说,这极大地...

    Python库 | GitPython-2.1.6-py2.py3-none-any.whl

    GitPython库的核心功能包括创建、克隆、提交、推送、拉取和分支操作,以及对Git仓库的全面管理。它通过封装Git命令行工具的输出,为Python程序员提供了一个简洁而直观的API,使得在代码中处理Git操作变得简单。 ...

    GitPython是用于与Git存储库进行交互的python库。-Python开发

    GitPython GitPython是一个python库,用于与git存储库(如git-porcelain的高级)或类似于git-plumbing的低级进行交互。 它提供了git对象的抽象以方便访问存储库数据,并且添加了GitPython GitPython是一个python库,...

    gitdb-0.6.4-cp38-cp38-win_amd64.whl.zip

    5. **与GitPython的关系**:Gitdb通常与GitPython库一起使用,GitPython提供了一个更高层次的API,使得开发者可以更方便地进行诸如克隆、拉取、提交等Git操作。 `.whl` 文件的使用: 在Python环境中,`.whl` 文件...

    用Python解决工作、生活、学习中的小问题

    对于项目管理和版本控制,Git和GitHub是开发者不可或缺的工具,而Python的GitPython库则能让你在代码中直接操作Git。 Python的面向对象编程特性使它适合构建大型系统。类和对象的概念使得代码结构清晰,易于维护。...

    集体智慧编程(源代码)

    GitPython库可以用来直接在Python环境中操作Git仓库。 4. 机器学习和人工智能:Python的Scikit-learn库提供了大量的机器学习算法,如分类、回归、聚类等,可以应用于集体智慧产生的数据中,发现潜在规律。...

    模仿机器人先生电视连续剧中的所有命令_Python_下载.zip

    12. **代码版本控制**:虽然不是Python的直接部分,但项目名为"mr-robot-master"可能意味着使用了Git进行版本控制,学习如何使用gitpython库进行Git操作也是其中的知识点。 这个项目可能包括了各种Python脚本,每个...

    Mastering-Python-Scripting-for-System-Administrators--master.zip

    7. **版本控制**:Git是常用的版本控制系统,Python的gitpython库允许在脚本中集成Git操作。 8. **性能监控**:Python可以结合psutil库获取系统资源使用情况,如CPU、内存、磁盘和网络状态。 9. **脚本部署与打包*...

    毕业设计——源代码版本迭代分析系统的设计与实现.zip

    例如,可以利用GitPython库来操作Git仓库,获取代码的提交历史,进行版本分析。此外,Python的Django或Flask框架也可能用于构建系统的后端架构,提供数据存储和处理功能。 其次,Java作为一种多范式语言,尤其适合...

    学习和工作记录笔记的地方

    9. **版本控制**:Git是广泛使用的版本控制系统,Python有如gitpython库,可以方便地在Python程序中进行Git操作。 在实际工作中,Python可以用于自动化任务、数据分析、机器学习、网络编程、游戏开发等多种场景。...

    DevOps in Python

    Git是广泛使用的版本控制系统,Python的gitpython库提供了与Git交互的接口,使得在代码版本管理中集成DevOps流程成为可能。 八、安全与合规性 Python的OWASP ZAP、bandit等工具可用于安全扫描和代码审计,确保代码...

    Python-自己动手实现区块链数据库Git游戏Docker等技术的教程大全

    Python中的gitpython库能让你模拟Git的基本功能,理解分支、合并、提交、克隆等操作。 游戏开发通常涉及物理引擎和3D渲染。物理引擎如PyBox2D可以帮助你理解碰撞检测、重力等基本物理现象。对于3D渲染,Python的...

    Python库 | GitPython-2.0.1-py2.py3-none-any.whl

    资源分类:Python库 所属语言:Python 资源全名:GitPython-2.0.1-py2.py3-none-any.whl 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059

    Python-SpreadingThankfulnessinOpenSource

    6. **版本控制**:Python还可以与Git协同工作,用于版本管理和代码协作,例如使用gitpython库进行Git操作。 在开源社区,感谢文化的推广能够增加参与者的满足感,进一步激发他们对项目持续投入的热情。通过Python和...

    Trac安装用到的软件

    对于Git项目,Trac需要gitPython库。 5. **其他依赖**: 可能还需要一些额外的Python库,如Pygments(用于代码高亮),Genshi(用于模板渲染),以及可能的插件所依赖的库。 6. **安装Trac**: 下载Trac的源码包,...

    python学习手册

    13. **版本控制**:Git是常用的版本控制系统,Python的gitpython库可以帮助进行与Git的交互。 "Python学习手册(第4版).pdf"可能是该主题的主要教材,涵盖以上所述的知识点。"拼吾爱 - 最新编程资源的分享下载站.url...

    Gitpython是一个用于与Git存储库进行交互的Python库。

    如果你喜欢这个想法并想要了解更多,请前往托诺,拍摄的鸟类,拍摄' git'在rust.gitpython是一个python库,用于与git存储库互动,高电平,如git -plumbing等低级。它提供了Git对象的抽象,以便于存储库数据,并添加...

    DevOps in Python.zip

    Python有PyGit2和gitpython库,便于在代码中进行Git操作。同时,Git工作流如GitFlow和GitHub Flow可以帮助团队有效地协作和管理代码变更。 在安全方面,Python也有如OWASP ZAP这样的自动化安全测试工具,用于Web...

    GitPython-main.zip

    GitPython 是一个专门为 Python 开发者设计的库,它提供了高级接口来操作 Git 仓库,使得与 Git 进行交互变得更加简单和高效。这个库允许开发者以编程方式执行几乎所有的 Git 命令,包括创建、提交、分支、合并、...

Global site tag (gtag.js) - Google Analytics