当前位置: 首页 > news >正文

Python 脚本化 Git 操作:简单、高效、无压力

前言

如何判定此次测试是否达标,代码覆盖率是衡量的标准之一。前段时间,利用fastapi框架重写了覆盖率统计服务,核心其实就是先获取全量代码覆盖率,然后通过diff操作统计增量代码覆盖率,当然要使用diff操作,避免不了与git打交道,那python如何操作gi t呢?

GitPython

GitPython库提供了访问和操作Git仓库的方法,使得在Python环境下进行Git操作变得非常简单。

安装GitPython

使用pip包管理器来安装GitPython:

 
pip install gitpython

克隆仓库

在开始使用GitPython操作Git仓库之前,我们首先需要克隆一个Git仓库到本地。下面是一个简单的示例代码:

 
from git import Repo
​
​
remote_url = 'https://github.com/username/repository.git'
local_path = '/path/to/local/repository'
​
​
Repo.clone_from(remote_url, local_path)

上述代码中,设置远程仓库的URL和本地路径,最后使用Repo.clone_from()方法来克隆远程仓库到本地。

当然,如果本地仓库已经存在,就不需要调用clone_from()进行克隆了,可以增加判断,变为下面这样

 
remote_url = 'https://github.com/username/repository.git'
local_path = '/path/to/local/repository'
if os.path.exists(local_path):repo = Repo(local_path)
else:repo = Repo.clone_from(remote_url, local_path)

我们判断了本地仓库是否存在,不存在进行克隆,如果存在直接实例化

获取分支信息

接下来,我们将获取已克隆仓库的所有分支信息。

 
from git import Repo
​
repo_path = '/path/to/your/git/repository'
​
repo = Repo(repo_path)
branches = repo.heads
​
for branch in branches:print(f"Branch: {branch.name}, Commit ID: {branch.commit}")

通过heads来获取所有分支,然后遍历输出分支名称和对应的 commit ID

提交更改

要提交更改,我们需要添加文件到暂存区,并提交更改。

 
from git import Repo
​
repo_path = '/path/to/your/git/repository'
​
repo = Repo(repo_path)
repo.index.add(['file1.py', 'file2.py'])
repo.index.commit("Commit message")

这部分功能,在代码覆盖率统计中未用到,这里做一个记录了解吧。

查看状态

 
from git import Repo
​
​
​
repo_path = '/path/to/your/git/repository'
​
repo = Repo(repo_path)
​
repo_status = repo.git.status()
print(repo_status)

代码中通过status来查看状态,其实和gi t的命令是一样的。

切换分支和合并代码

 
from git import Repo
​
​
​
repo_path = '/path/to/your/git/repository'
repo = Repo(repo_path)
​
repo.git.checkout('develop')
​
repo.git.merge('feature-branch')
​

以上代码使用checkout切换到指定分支然后使用merge合并代码。

获取远程仓库的最新变更

 
from git import Repo
​
​
repo_path = '/path/to/your/git/repository'
​
repo = Repo(repo_path)
repo.fetch()

从远程仓库获取最新的提交记录、分支和文件,但并不自动合并到本地代码。它只是将远程仓库的最新变更拉取到本地,但不会自动更新工作目录中的文件。这意味着在执行 git fetch 后,需要手动进行合并或重新基于远程分支进行开发。

diff操作

 
from git import Repo
​
​
repo_path = '/path/to/your/git/repository'
​
repo = Repo(repo_path)
repo.git.diff(base_branch, current_branch)

使用 git.diff() 方法比较了 base_branchcurrent_branch 之间的差异

实战案例

下面讲一下笔者统计增量覆盖率的核心代码

 
    def get_diff(self, current_branch: str, base_branch: str = "origin/master"):"""获取版本之间代码差异"""diff = self.repo.git.diff(base_branch, current_branch).split("\n")
​ret = {}file_name = ""diff_lines = []current_line = 0for line in diff:if line.startswith("diff --git"):if file_name != "":ret[file_name] = diff_linesfile_name = re.findall("b/(\S+)$", line)[0]diff_lines = []current_line = 0
​elif re.match("@@ -\d+,\d+ +(\d+),\d+ @@", line):match = re.match("@@ -\d+,\d+ +(\d+),\d+ @@", line)current_line = int(match.group(1)) - 1
​elif line.startswith("-"):continueelif line.startswith("+") and not line.startswith("+++"):current_line += 1diff_lines.append(current_line)else:current_line += 1ret[file_name] = diff_linesreturn ret

这段用于获取两个分支之间的代码差异。

  • get_diff 方法接受两个参数 current_branchbase_branch,分别表示当前分支和基准分支,默认为 "origin/master"。
  • 通过调用 self.repo.git.diff(base_branch, current_branch) 方法获取基准分支和当前分支之间的代码差异,并将结果按行拆分成列表。
  • 使用一个字典 ret 来存储代码差异的信息,其中键为文件名,值为差异的行号列表。
  • 遍历代码差异行,根据行的内容进行不同的处理:

    • 如果遇到以 "diff --git" 开头的行,则表示开始处理一个新文件的差异,提取文件名。
    • 如果匹配到以 "@@ -\d+,\d+ +(\d+),\d+ @@" 格式的行,则提取新版本代码的起始行号。
    • 如果遇到以 "-" 开头的行,则表示该行在基准分支中有但在当前分支中没有,忽略。
    • 如果遇到以 "+" 开头且不以 "+++" 开头的行,则表示该行在当前分支中新增,记录当前行号并添加到差异行列表中。
    • 其他情况下,当前行号递增。
  • 最后将最后一个文件的差异行信息添加到字典中,并返回整体的差异信息。

这段代码的作用是从 Git 中提取两个版本之间的代码差异信息,并以文件名及差异行号的形式存储返回。

最后

GitPython极大方便了python操作gi t,让我更快速的实现了增量代码覆盖率的统计工作,当然这里只是笔者在实现覆盖率统计工作中用到的GitPython相关的方法,还有更多方法,可以翻阅官方文档:gitpython.readthedocs.io/en/stable/

 下面是配套资料,对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!

软件测试面试小程序
被百万人刷爆的软件测试题库!!!谁用谁知道!!!全网最全面试刷题小程序,手机就可以刷题,地铁上公交上,卷起来!

涵盖以下这些面试题板块:

1、软件测试基础理论 ,2、web,app,接口功能测试 ,3、网络 ,4、数据库 ,5、linux 6、web,app,接口自动化 ,7、性能测试 ,8、编程基础,9、hr面试题 10、开放性测试题,11、安全测试,12、计算机基础

​编辑资料获取方式 :xiaobei_upup,添加时备注“csdn alex”

相关文章:

Python 脚本化 Git 操作:简单、高效、无压力

前言 如何判定此次测试是否达标,代码覆盖率是衡量的标准之一。前段时间,利用fastapi框架重写了覆盖率统计服务,核心其实就是先获取全量代码覆盖率,然后通过diff操作统计增量代码覆盖率,当然要使用diff操作&#xff0c…...

手搓顺序表(C语言)

目录 SeqList.h SeqList.c 头插尾插复用任意位置插入 头删尾删复用任意位置删除 SLtest.c 测试示例 顺序表优劣分析 SeqList.h //SeqList.h#pragma once#include <stdio.h> #include <assert.h> #include <stdlib.h> #define IN_CY 3typedef int S…...

一文搞懂oracle事务提交以及脏数据落盘的原则

本文基于oracle 19c 做事务提交以及oracle脏数据落盘的相关解读 第一章 相关进程及组件介绍&#xff1a; 1.LGWR&#xff1a; 重做日志条目在系统全局区域 &#xff08;SGA&#xff09; 的重做日志缓冲区中生成。LGWR 按顺序将重做日志条目写入重做日志文件。如果数据库具有…...

OceanBase:列存储

目录 1、列存储的定义 1、默认创建列存表 3、指定创建列存表 4、指定创建列存行存冗余表 5、行、列存储查询测试 1、列存储的定义 行存储&#xff08;Row-based Storage&#xff09;&#xff1a;行存储是以行为单位进行组织和存储数据。在这一模式下&#xff0c;数据库将…...

Rust:WIndows 环境下交叉编译 Linux 平台程序

在Windows下交叉编译Rust程序以在x86_64位的CentOS操作系统上运行&#xff0c;你需要遵循几个步骤来设置交叉编译环境并编译你的程序。以下是一个大致的指南&#xff1a; 1. 安装Rust和Cargo 首先&#xff0c;确保你已经在Windows上安装了Rust和Cargo。你可以从Rust官方网站下…...

从零学爬虫:使用比如说说解析网页结构

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、引言 二、网页结构概述 示例&#xff1a;查看网页结构 三、使用比如说说解析网页 1.…...

C#数据类型变量、常量

一个变量只不过是一个供程序操作的存储区的名字。 在 C# 中&#xff0c;变量是用于存储和表示数据的标识符&#xff0c;在声明变量时&#xff0c;您需要指定变量的类型&#xff0c;并且可以选择性地为其分配一个初始值。 在 C# 中&#xff0c;每个变量都有一个特定的类型&…...

Java高级面试问题及答案

Java高级面试问题及答案 问题1: 请描述Java内存模型(JMM)及其在并发编程中的重要性。 探讨过程&#xff1a; 在并发编程中&#xff0c;多个线程之间如何协调对共享变量的访问是一个核心问题。Java内存模型定义了一组规则&#xff0c;来确保在多线程环境中对共享变量的修改能够…...

出现 Transaction rolled back because it has been marked as rollback-only 解决方法

目录 1. 问题所示2. 原理分析3. 解决方法1. 问题所示 用户反馈的Bug如下所示: Transaction rolled back because it has been marked as rollback-only截图如下: 浏览器终端同样显示: 2. 原理分析 错误表明,在事务的生命周期内,遇到了某个异常或条件,导致该事务被标记…...

数据结构算法题day03

数据结构算法题day03 题目 题目 2.设计一个高效算法&#xff0c;将顺序表L的所有元素逆置&#xff0c;要求算法的空间复杂度为O(1)算法思想&#xff1a; 1、常规的解法&#xff1a; Void reverse (sqlist &L){Elemtype temp; //辅助变量for(i 0,i < L.length; i){temp…...

深入分析C#中的“编写器”概念——代码修改、注解与重构

文章目录 1. 编写器&#xff08;Writer&#xff09;的概念2. 编写器的作用和工作原理3. 编写器的重要性4. 写入器常用方法5. 写入器示例6. 编写器示例——使用Fody进行代码注解和重构7. 总结 在软件开发过程中&#xff0c;代码的维护和更新是至关重要的。C#作为一种流行的编程语…...

uview1.0 u-form表单回显校验不通过

提交到后端的数据&#xff0c;回显后不做任何修改无法通过表单校验 原因&#xff0c;u-form表单校验的类型默认为string&#xff0c;但是后端返回的是integer类型&#xff0c;导致无法通过校验 解决&#xff0c;既然后端返回的是整数形&#xff0c;那么我们就将校验规则的type…...

监控员工电脑的软件有哪些,不得不说这几款电脑监控软件太好用了

监控员工电脑的软件在市场上种类繁多&#xff0c;以下是几款备受好评的电脑监控软件&#xff0c;它们各自具有独特的功能和优势&#xff0c;选择前必须了解一下才能做成正确决定。 1.安企神&#xff1a; 这款软件支持7天试用测试&#xff0c;获取测试版请移驾 ↓↓↓ 安企神…...

【MySQL精通之路】索引优化(2)

目录 1 MySQL如何使用索引 2 主键优化 3 空间索引优化 4 外键优化 5 列索引 6 多列索引 7 验证索引使用情况 8 InnoDB和MyISAM索引统计集合 9 B树索引与哈希索引的比较 9.1 B-树索引特征 9.2 哈希索引特征 10 索引扩展的使用 11 优化器使用生成的列索引 12 不可见…...

VUE3 学习笔记(5):数组处理、计算属性与函数、class与Style绑定

数组监测处理方法 VUE 提供了关于数组处理的直接方法&#xff0c;但并非全部都是可以处理的 如下可以直接处理&#xff1a; .push --向数组中增加 .pop --从数组中最后减去一个元素 .shift --从数组中第一个减去一个元素 .unshift --在数组中的头部添加一个元素 .splice --自定…...

基于springboot实现大学生一体化服务平台系统项目【项目源码+论文说明】

基于springboot实现大学生一体化服务平台系统演示 摘要 如今社会上各行各业&#xff0c;都喜欢用自己行业的专属软件工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。新技术的产生&#xff0c;往往能解决一些老技术的弊端问题。因为传统大学生综…...

惠海 H6902B 升压恒流芯片 太阳能 风扇灯 应急灯 支持3.7V 5V 7.4V

惠海H6902B升压恒流驱动芯片是一款专为LED照明应用设计的驱动方案。该芯片具有多项产品特征&#xff0c;能够满足多种LED照明需求。 适用于多种电压输入范围&#xff08;2.7V-80V&#xff09;并具备效率&#xff08;达95%以上&#xff09;和工作频率&#xff08;1MHz&#xff…...

体验SmartEDA的高效与便捷,电子设计从未如此简单

SmartEDA&#xff1a;革新电子设计&#xff0c;让高效与便捷触手可及 在快节奏的现代生活中&#xff0c;科技日新月异&#xff0c;各行各业都在寻求更高效、更便捷的解决方案。对于电子设计行业而言&#xff0c;SmartEDA的出现&#xff0c;无疑是一场革命性的变革。它以其高效…...

LangChain笔记

很好的LLM知识博客&#xff1a; https://lilianweng.github.io/posts/2023-06-23-agent/ LangChain的prompt hub: https://smith.langchain.com/hub 一. Q&A 1. Q&A os.environ["OPENAI_API_KEY"] “OpenAI的KEY” # 把openai-key放到环境变量里&…...

金融序列的布朗运动

https://zhuanlan.zhihu.com/p/659164160 python金融衍生品定价系列之一 —— 布朗运动与伊藤公式 导语:网络上和书本上关于期权定价相关的内容已经较为丰富,但将理论和python代码结合起来讲的却很少,这也是python金融衍生品定价系列的写作初衷,在用python实现相关模型的同…...

遍历 Map 类型集合的方法汇总

1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)

概述 在 Swift 开发语言中&#xff0c;各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过&#xff0c;在涉及到多个子类派生于基类进行多态模拟的场景下&#xff0c;…...

FastAPI 教程:从入门到实践

FastAPI 是一个现代、快速&#xff08;高性能&#xff09;的 Web 框架&#xff0c;用于构建 API&#xff0c;支持 Python 3.6。它基于标准 Python 类型提示&#xff0c;易于学习且功能强大。以下是一个完整的 FastAPI 入门教程&#xff0c;涵盖从环境搭建到创建并运行一个简单的…...

LeetCode - 394. 字符串解码

题目 394. 字符串解码 - 力扣&#xff08;LeetCode&#xff09; 思路 使用两个栈&#xff1a;一个存储重复次数&#xff0c;一个存储字符串 遍历输入字符串&#xff1a; 数字处理&#xff1a;遇到数字时&#xff0c;累积计算重复次数左括号处理&#xff1a;保存当前状态&a…...

postgresql|数据库|只读用户的创建和删除(备忘)

CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...

根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:

根据万维钢精英日课6的内容&#xff0c;使用AI&#xff08;2025&#xff09;可以参考以下方法&#xff1a; 四个洞见 模型已经比人聪明&#xff1a;以ChatGPT o3为代表的AI非常强大&#xff0c;能运用高级理论解释道理、引用最新学术论文&#xff0c;生成对顶尖科学家都有用的…...

DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”

目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...

JAVA后端开发——多租户

数据隔离是多租户系统中的核心概念&#xff0c;确保一个租户&#xff08;在这个系统中可能是一个公司或一个独立的客户&#xff09;的数据对其他租户是不可见的。在 RuoYi 框架&#xff08;您当前项目所使用的基础框架&#xff09;中&#xff0c;这通常是通过在数据表中增加一个…...

Java毕业设计:WML信息查询与后端信息发布系统开发

JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发&#xff0c;实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构&#xff0c;服务器端使用Java Servlet处理请求&#xff0c;数据库采用MySQL存储信息&#xff0…...

Webpack性能优化:构建速度与体积优化策略

一、构建速度优化 1、​​升级Webpack和Node.js​​ ​​优化效果​​&#xff1a;Webpack 4比Webpack 3构建时间降低60%-98%。​​原因​​&#xff1a; V8引擎优化&#xff08;for of替代forEach、Map/Set替代Object&#xff09;。默认使用更快的md4哈希算法。AST直接从Loa…...