Daily Archives: 2012/11/13

在git中使用Python打补丁包


有时候, 我们写完一个项目需要对其进行打包. 打完成包非常简单, 我们可以使用git archive这个命令. 但是有时候我们需要对项目的一些特殊文件进行过滤. 这个时候, 可能会说这些文件可以放在.gitingore中. 我需要告诉的时, 在开发项目的时候, 有些文件也需要在git仓中, 以方便其他小组的人使用. 另一种情况, 我们需要打一个差异包出来, 如果没有任何特殊要求, 可以直接使用tar zxvf xxx-patch.tar.gz `git diff –name-only`进行打包. 但是你这个仓中含有很多个submodule时候, 使用这种方法, 会遇到一个很不幸的事, 不管这个子模块修改了一个, 还是多个文件, 他都会将这个子模块全部打包进去. 因此, 我们需要一个好的打包工具, 解决以上问题. 目前我是采用python + pygit2的方式. 同时你系统环境中要有git.

1. 获取git仓中tags列表

pygit2有一个已知的bug, 你给你的项目打tag, 如果打tag时候没有加上message. pygit2是无法读取到的.
读取git仓中的tag非常的简单. 代码如下

def get_tags(self):
 self.tags = [];
 print "=== Parsing package version";
 data = self.repo.listall_references();

 for item in data:
  ref = self.repo.lookup_reference(item);
  if (ref.type == pygit2.GIT_OBJ_COMMIT):
   oid = ref.oid;
   ref_obj = self.repo[oid];
   if isinstance(ref_obj, pygit2.Tag):
    self.tags.append(ref_obj);
   else:
    continue;
 self.tags.sort(lambda x,y: cmp(y.tagger.time, x.tagger.time));

获取tag之后, 我们可以使用tag下属性timer, 根据时间先后次序进行排序. 这样你想取最后一个tag作为目标进行打包 只要self.tags[0](倒序)就能直接获取到. 同样你需要获取两个版本的差异. 只要git diff tag[0]..tag[1]
Read more »