利用git钩子,使用python语言获取提交的文件列表

项目有个需求,需要获取push到远程版本库的文件列表,并对文件进行特定分析。很自然的想到,要利用git钩子来触发一个脚本,实现获取文件列表的功能。比较着急使用该功能,就用python配合一些git命令写了一个脚本出来,等想到更好的方法后再对脚本进行修改。

#!/usr/bin/env python
#coding=utf-8
‘‘‘
该脚本在pre-receive或post-receive钩子中被调用,也可以直接将该文件作为git的钩子使用
若钩子为shell脚本,则需要加入以下代码调用该脚本:
while read line;do
        echo $line | python $PATH/pre-receive.py
done
当用户执行git push的时候会在远程版本库上触发此脚本
该脚本的主要作用:获取用户提交至版本库的文件列表,提交者及时间信息
‘‘‘

import sys,subprocess

__author__ = "liuzhenwei"

class Trigger(object):

	def __init__(self):
		‘‘‘
		初始化文件列表信息,提交者信息,提交时间,当前操作的分支
		‘‘‘
		self.pushAuthor = ""
		self.pushTime = ""
		self.fileList = []
		self.ref = ""

	def __getGitInfo(self):
		‘‘‘
		‘‘‘
		self.oldObject,self.newObject,self.ref = sys.stdin.readline().strip().split(‘ ‘)

	def __getPushInfo(self):
		‘‘‘
		git show命令获取push作者,时间,以及文件列表
		文件的路径为相对于版本库根目录的一个相对路径
		‘‘‘

		rev = subprocess.Popen(‘git rev-list ‘+self.newObject,shell=True,stdout=subprocess.PIPE)
		revList = rev.stdout.readlines()
		revList = [x.strip() for x in revList]

		#查找从上次提交self.oldObject之后还有多少次提交,即本次push提交的object列表
		indexOld = revList.index(self.oldObject)
		pushList = revList[:indexOld]

		#循环获取每次提交的文件列表
		for pObject in pushList:
			p = subprocess.Popen(‘git show ‘+pObject,shell=True,stdout=subprocess.PIPE)
			pipe = p.stdout.readlines()
			pipe = [x.strip() for x in pipe]

			self.pushAuthor = pipe[1].strip("Author:").strip()
			self.pushTime = pipe[2].strip("Date:").strip()

			self.fileList.extend([ ‘/‘.join(fileName.split("/")[1:]) for fileName in pipe if fileName.startswith("+++") and not fileName.endswith("null")])

	def getGitPushInfo(self):
		‘‘‘
		返回文件列表信息,提交者信息,提交时间
		‘‘‘
		self.__getGitInfo()
		self.__getPushInfo()

		print "Time:",self.pushTime
		print "Author:",self.pushAuthor
		print "Ref:",self.ref
		print "Files:",self.fileList

if __name__ == "__main__":
	t = Trigger()
	t.getGitPushInfo()
时间: 2024-12-18 23:51:41

利用git钩子,使用python语言获取提交的文件列表的相关文章

[转] 利用git钩子,使用python语言获取提交的文件列表

项目有个需求,需要获取push到远程版本库的文件列表,并对文件进行特定分析.很自然的想到,要利用git钩子来触发一个脚本,实现获取文件列表的功能.比较着急使用该功能,就用python配合一些git命令写了一个脚本出来,等想到更好的方法后再对脚本进行修改. #!/usr/bin/env python #coding=utf-8 ''' 该脚本在pre-receive或post-receive钩子中被调用,也可以直接将该文件作为git的钩子使用 若钩子为shell脚本,则需要加入以下代码调用该脚本:

服务端CVS本地Git的版本控制:利用git钩子自定义工作流

请以解决问题为核心,不要为了用技术而用技术. 公司各个项目有CVS.SVN.HG.Git等多版本管理工具. 但CVS确实太老了,十分不便,由于历史原因公司的部分旧代码还都是用CVS来管理,恰恰是我目前在用的- -|||.但是我们可以在本地使用Git来方便代码的管理.因为Git作为分布式版本管理系统,本身local端就是完备的. 如果是用SVN.HG等版本控制系统,有git-svn等解决方案可以不改变服务端而非常方便的在本地用git,但CVS并没有找到现成的方法-,可能确实太老了吧! 最近终于想到

利用git向github上远程提交一个自己的开源项目

1.在电脑的系统变量中的path路径中配置git的环境变量: 找到git安装路径中bin的位置,如:X:\Git\bin 找到git安装路径中git-core的位置,如:X:\Git\libexec\git-core; 然后将这两个路径配置到系统变量的path中即可 2.打开命令行(cmd+enter),将目录切换到项目目录:例如:D:\>cd D:\wps_github\LoopLinearViewItem,然后点击enter 3.然后输入如下命令并点击enter D:\wps_github\

git取两次提交的文件列表,包含目录信息

1.用git rev-list HEAD取得版本号列表: 在SmartGit中看到的也是这样,验证了我们的猜想: 取到两个版本号之后,用git diff命令:git diff [--options] <commit>...<commit> [--] [<path>-?] 这里的[-options]我们填的是--name-status,<commit>指的是版本号,也就是每次版本的散列值,可以填前几位就可以了,git会自动识别. 命令的具体参考帮助文档:git

eclipse的Git忽略某些不需要提交的文件

Eclipse切换到Navigator视图,找到.gitignore文件(如果是maven项目,一般找作为modules的项目的.gitignore文件),添加内容: .settings .project target .classpath *.gitignore 原文地址:https://www.cnblogs.com/sos-blue/p/9440450.html

利用git提交代码

一.首先需要下载git 查看电脑是否安装git,打开终端,输入git,回车如果输出如下,则代表已安装了git 如果未安装,则会输出: 按照提示输入:sudo apt-get install git即可安装!!或者到此处下载:git下载, pkg包下载完成,双击安装. 输入命令:git --version 可查看当前git版本 二.安装后需要一些配置  配置用户名和邮箱: $ git config --global user.name "Your Name" $ git config -

Git 钩子

1. 概念概述 1.1. 安装钩子 1.2. 脚本语言 1.3. 钩子的作用域 2. 本地钩子 2.1. 预提交钩子 Pre-Commit 2.2. 准备提交信息钩子 Prepare Commit Message 2.3. 提交信息钩子 Commit Message 2.4. 提交后钩子 Post-Commit 2.5. 切换后钩子 Post-Checkout 2.6. 预衍合钩子 Pre-Rebase 3. 服务端钩子 3.1. 预接收钩子 Pre-Receive 3.2. 更新钩子 Upda

利用SVN钩子同步程序注意事项

暂时记下,此文章内容稍后验证. 前言:其实利用SVN实时同步到WEB服务器即时展现出来的文章已经到处都是,但是我在做的时候 还是有不少的小问题,很多文章也没有提出来过,还有同步也是,我还是记录下自己做过的尤其是一些细节,时间一长又会忘掉了. 同步程序思路:用户提交程序到SVN,SVN触发hooks,按不同的hooks进行处理,这里用到的是post-commit,利用post-commit到代码检出到SVN服务器的本地硬盘目录,再通过rsync同步到远程的WEB服务器上. 知识点:1.SVN的ho

git钩子

定义: 钩子:由事件触发的函数 分类: 客户端钩子:由诸如提交和合并这样的操作触发 服务器端钩子:由诸如接收被推送的提交这样的联网操作触发 安装: a.钩子都被存储在 .git 目录下的 hooks 子目录中 b.当 git init 初始化一个新版本库时,默认会在这个目录中放置一些示例脚本 c.任何正确命名的可执行脚本都可以正常使用(Ruby.Python.shell或其它语言) d.这些示例的名字都是以.sample 结尾,如果想启用它们,移除这个后缀就可以了 客户端钩子: 提交工作流钩子: