工程地址: https://pypi.python.org/pypi/GitPython/
需要安装先安装: gitdb https://pypi.python.org/pypi/gitdb

GitPython使用模块对象访问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
 

GitPython git python 的开发库的更多相关文章

  1. Python测试 ——开发工具库

    Web UI测试自动化 splinter - web UI测试工具,基于selnium封装. selenium - web UI自动化测试. mechanize- Python中有状态的程序化Web浏 ...

  2. Python集成开发环境Pycharm+Git+Gitee(码云)

    ********************************************************************* 本文主要介绍集成开发环境的配置过程,方便多人协作办公.代码版 ...

  3. python测试开发工具库汇总(转载)

    Web UI测试自动化 splinter - web UI测试工具,基于selnium封装. selenium - web UI自动化测试. mechanize- Python中有状态的程序化Web浏 ...

  4. sklearn:Python语言开发的通用机器学习库

    引言:深入理解机器学习并全然看懂sklearn文档,须要较深厚的理论基础.可是.要将sklearn应用于实际的项目中,仅仅须要对机器学习理论有一个主要的掌握,就能够直接调用其API来完毕各种机器学习问 ...

  5. 《Python测试开发技术栈—巴哥职场进化记》—软件测试工程师“兵器库”

    上文<Python测试开发技术栈-巴哥职场进化记>-初来乍到,请多关照 我们介绍了巴哥入职后见到了自己的导师华哥,第一次参加团队站会,认识了团队中的开发小哥哥和产品小姐姐以及吃到了公司的加 ...

  6. 【转】windows和linux中搭建python集成开发环境IDE

    本系列分为两篇: 1.[转]windows和linux中搭建python集成开发环境IDE 2.[转]linux和windows下安装python集成开发环境及其python包 3.windows和l ...

  7. 【转】linux和windows下安装python集成开发环境及其python包

    本系列分为两篇: 1.[转]windows和linux中搭建python集成开发环境IDE 2.[转]linux和windows下安装python集成开发环境及其python包 3.windows和l ...

  8. Python后端开发要求

    关于Python后端开发要求 一.对Python有兴趣,熟悉Python(标准库) 最好阅读过源码 了解Python的优化(熟悉pypy更佳) 二.至少至少一门语言(不说"精通") ...

  9. Pycharm中进行Python远程开发

    http://blog.csdn.net/pipisorry/article/details/52269952 PyCharm提供两种远程调试(Remote Debugging)的方式:    配置远 ...

随机推荐

  1. VS2012配置Lua环境

    1.VS2012配置BabeLua插件 2.VS2012配置Lua 1.VS2012配置BabeLua插件 BabeLua插件简介: 安装方法: 关闭VS2012后直接安装BabeLua插件. 下载地 ...

  2. SPOJ-SQRBR Square Brackets

    原题传送:http://www.spoj.pl/problems/SQRBR 动态规划. 设f[i][j]表示前i个位置在合法情况下缺少j个右括号的方案数. 转移方程为: f[i][j] = f[i- ...

  3. Hibernate O/R Mapping模拟

    作为SSH中的重要一环,有必要理解一下Hibernate对 O/R Mapping的实现. 主要利用java的反射机制来得到完整的SQL语句. 准备工作: 1. Object Student实体类: ...

  4. NYOJ-86 找球号(一)AC 分类: NYOJ 2014-02-02 10:45 160人阅读 评论(0) 收藏

    NO.1 单纯的傻傻的代码: #include<stdio.h> long long num[100000005]={0}; int main(){ int n, m, k; scanf( ...

  5. 3-Highcharts 3D图之3D柱状图分组叠堆3D图

    <!DOCTYPE> <html lang='en'> <head> <title>3-Highcharts 3D图之3D柱状图分组叠堆3D图</ ...

  6. 使用微信JSSDK自定义分享内容

    微信在6.0.2.58版本以后开始使用新的api,在Android系统中不能用以前的代码来自定义分享内容了. 现在自定义内容的方法走的是公众号的一套流程 1获取access_token 2得到toke ...

  7. 使用eclipse maven遇到的错误(转)

    [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:2.5:resources (defaul ...

  8. (翻译)Google Guava Cache

    翻译自Google Guava Cache This Post is a continuation of my series on Google Guava, this time covering G ...

  9. Ruby中的语句中断和返回

    李哲 - APRIL 28, 2015 return,break,next 这几个关键字的使用都涉及到跳出作用域的问题,而他们的不同 则在于不同的关键字跳出去的目的作用域的不同,因为有代码块则导致有一 ...

  10. jvm 之 国际酒店 6月25日上线内存溢出原因

    6月25日OMS,Ihotel上线成功后执行了一个批处理,SOA报警提示某一台IHOTEL机器调用OMS失败率大于阀值,登录这个机器后发现这台机器CPU使用率处于80%以上,调用OMS有的时候超过5秒 ...