文档章节

使用 pygit2 创建提交

openthings
 openthings
发布于 2015/01/18 15:47
字数 585
阅读 99
收藏 0

本文来自依云's Blog,转载请注明。

pygit2 是 libgit2 的 Python 绑定,而 libgit2 是一个可动态链接的 git 库,除去头文件和 pkgconfig 信息就一个 .so 文件。它是我在 The Architecture of Open Source Applications(AOSA)第二巻讲 git 的部分中看到的。git 本身遵循了传统的 Unix 哲学,提供了一系列的命令来管理源码库。这对于 shell 脚本是非常不错,可是对于嵌入到其它应用(如 IDE、Web 服务)中却不太好用。于是,我们有了 libgit2。

很遗憾的是,我并没有找到 API 文档,只有一些示例性的用法介绍,更别提教程之类。即使在 pygit2 中,使用help命令能够得到的信息也很有限。所以,我只能在 Python 这样动态语言的交互式会话时独自探索。

下面是我搜索出来的使用 pygit2 进行提交的过程:

导入需要用到的模块:

1
2
import     pygit2
import     time

我的 git 仓库,还有 index:

1
2
repo     =     pygit2.Repository(     '/home/lilydjwg/.vim/.git'     )
ind     =     repo.index

先看看未提交到 index 的修改(相当于git diff

1
print     (ind.diff())

唔,我看到就一个plugin/colorizer.vim文件修改了。把它加到 index 中(相当于git add)。如果是git rm的话就用del ind[filename]了。操作之后要调用write()方法写入更改。

1
2
ind.add(     'plugin/colorizer.vim'     )
ind.write()

写入 tree 对象,其返回值是二进制编码的 hash 值(使用binascii.b2a_hex可编码成 git 命令中使用的字符串)

1
oid     =     ind.write_tree()

作者和提交者的信息,其中最后一个参数(offset)是以分钟计的时区偏移(当然是相对于 UTC)。邮件地址很显然被打码了 :-)

1
author     =     pygit2.Signature(     '依云'     ,     'a@b.c'     ,     int     (time.time()),     480     )

创建提交。其中HEAD是个「符号引用」(symbolic reference),而repo.head就是当前最后一个提交了,oid属性还是二进制编码的 hash 啦。这里,提交者和作者是同一人,因此我都使用刚刚创建的author对象了。这步就是git commit命令了。

1
repo.create_commit(     'HEAD'     , author, author,     'colorizer: solved name color conflict'     , oid, [repo.head.oid])

在命令行下看看结果是否正确:

1
2
3
4
5
6
7
>>> git     cat     -     file     -p HEAD
tree 20e8937d41b6df16da2c8c5661f9c4a8dd31b5a1
parent ab9c662ce0d1cb2deac7a9ae388ecb40d8ec5e15
author 依云 <a@b.c> 1340188028 +0800
committer 依云 <a@b.c> 1340188028 +0800
 
colorizer: solved name color conflict


本文转载自:http://lilydjwg.is-programmer.com/2012/6/20/use-pygit2-to-make-a-commit.34261.html

openthings
粉丝 324
博文 1140
码字总数 689435
作品 1
东城
架构师
私信 提问
使用pygit2进行clone时返回unsupported URL protocol

Mac OS 10.13.3 我是用的是pygit2的0.23.3版本,libgit2是0.23.4,在调用pygit2.clone_repository时返回了unsupported URL protocol,对远程仓库直接用git操作的话正常。另外我在终端的pytho...

Zero_Loser
2016/09/07
294
1
Pygit2 0.26.1 发布,libgit2 的 Python 绑定

Pygit2 0.26.1 已发布,Pygit2 是一组通过 Python 绑定到 libgit2 的共享库,libgit2 实现 Git 管道。Pygit2 支持 Python 2.7,3.3,3.4,3.5,3.6 和 PyPy 2.6。 更新如下: 新的 #730 改进 ss...

局长
2017/11/20
704
1
pygit2 0.28.0 发布,Git 的 Python 开发包

pygit2 0.28.2 发布了。pygit2 是一组 libgit2 共享库的 Python 绑定,libgit2 是 Git 核心方法的纯 C 实现,作为具有可靠 API 的可链接库提供,允许在应用程序中构建 Git 功能。pygit2 适用...

h4cd
05/28
794
1
Pygit2 v0.25 发布,Python 的 Git 开发包

Pygit2 v0.25 发布了。Pygit2 是一组 Python 绑定到 libgit2 共享库,libgit2 实现了 Git plumbing。该版本更新如下: 升级至 libgit2 0.25 #670 现在如果树未找到,Commit.tree 会引发一个错...

局长
2016/12/27
900
2
给Salt-Master添加增强版的白名单功能

测试环境: salt 2015.8 问题 现有的salt-minion有个功能,用来禁用指定模块,简单粗暴,不过远远不能满足需求,例如管理员常用的功能,禁用了影响使用体验,不禁用如果不小心输入个,那也是...

葫芦咩
2015/12/11
741
0

没有更多内容

加载失败,请刷新页面

加载更多

学习记录(day05-标签操作、属性绑定、语句控制、数据绑定、事件绑定、案例用户登录)

[TOC] 1.1.1标签操作v-text&v-html v-text:会把data中绑定的数据值原样输出。 v-html:会把data中值输出,且会自动解析html代码 <!--可以将指定的内容显示到标签体中--><标签 v-text=""></......

庭前云落
29分钟前
3
0
支撑微博亿级社交平台,小白也能玩转Redis集群(实战篇)

上篇文章《支撑微博亿级社交平台,小白也能玩转Redis集群(原理篇)》介绍了Redis集群相关原理,这篇文章将介绍Redis Cluster集群的搭建、配置,运维、扩容等具体操作 集群搭建 2018年10月 Re...

分布式系统架构
30分钟前
5
0
JVM -- 垃圾回收算法及分代垃圾收集器

Hello,今天记录下 Java虚拟机中的其中一个重点知识 --> 垃圾回收算法及分代垃圾收集器。 一起学习,一起进步。继续沉淀,慢慢强大。希望这文章对您有帮助。若有写的不好的地方,欢迎评论给建...

猫狗熊
44分钟前
3
0
ERC-777以太坊新代币标准解读

ERC777是一个新的高级代币标准,可以视为ERC20的升级版本,因此它解决了ERC20以及ERC223存在的一些问题,开发者可以根据自己的具体需求进行选型。 1、使用ERC820进行合约注册 有别于ERC20的自...

汇智网教程
今天
8
0
代理模式之JDK动态代理 — “JDK Dynamic Proxy“

动态代理的原理是什么? 所谓的动态代理,他是一个代理机制,代理机制可以看作是对调用目标的一个包装,这样我们对目标代码的调用不是直接发生的,而是通过代理完成,通过代理可以有效的让调...

code-ortaerc
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部