首页 > 其他分享 >记录一次git patch解析的问题

记录一次git patch解析的问题

时间:2023-04-27 23:24:58浏览次数:56  
标签:git 匹配 -- patch re txt diff 解析

因为工作需要对git patch内容进行解析,解析成文件及对应修改行、删除行的数据结构。
git patch大概内容:

点击查看代码
commit message 1
commit message 2
diff --git a/file1.txt b/file1.txt
index 1234567..abcdefg 100644
--- a/file1.txt
+++ b/file1.txt
@@ -1,3 +1,5 @@
 line1
 line2
 line3
+diff --git line4
+line5
+
diff --git a/file2.txt b/file2.txt
index 2345678..bcdefgh 100644
--- a/file2.txt
+++ b/file2.txt
@@ -1,3 +1,4 @@
 line1
 line2
-diff --git line3
+line3.1
+line3.2
 line4

原本使用split('diff')的方式分割成每个文件的修改内容,然后在对每一段内容进行匹配,比如匹配修改文件:
re.search(r'--git\s+a/(.*?)\s+b/', diff_string)
刚开始没有问题,后来遇到一种场景,如果一笔提交中包含了一个patch.diff文件的修改就会导致我分割的内容不准确(看以patch案例,会有+diff --git 或-diff --git的行),不是以一个文件的修改内容来分割。
初步考虑使用split('\ndiff'),但用diff分割后,匹配修改文件名时以上内容还是会造成干扰
最后调整为
diff = re.findall(r'\ndiff --git.*?(?=\n(?:diff --git|\Z))', git_patch, re.DOTALL)
使用正则的前视断言及开头的\ndiff来作为分隔符,使用\Z匹配字符串末尾。

在 Python 的 re 模块中,$ 符号和 \Z 符号都用于匹配字符串的结尾。但是,它们之间有一个细微的区别,这个区别取决于是否使用 re.MULTILINE(或 re.M)标志。
如果使用了 re.MULTILINE 标志,则 $ 符号可以匹配每一行的结尾。也就是说,当多行模式被启用时,$ 可以匹配每一行的末尾,而不仅仅是字符串的最后一个字符。
相反,\Z 符号只匹配字符串的末尾,无论是否使用多行模式。它始终匹配字符串的结尾位置,而不考虑是否有换行符。
综上所述,如果你需要匹配多行字符串中每一行的结尾,应该使用 $ 符号并启用 re.MULTILINE 标志;如果你只需要匹配整个字符串的结尾,则使用 \Z 符号即可。

python官网中的说明:
image

标签:git,匹配,--,patch,re,txt,diff,解析
From: https://www.cnblogs.com/zhengqdan/p/17360500.html

相关文章

  • Tinker Board 2s配置Jekins、Git、Github WebHook、内网穿透
    用途说明目的充分利用小型开发板的算力,实现个人服务器适用系统、硬件debian10及更高版本(lsb_release-a或cat/etc/redhat-release、uname-a)文章所使用硬件:TinkerBoard2s操作速览基础配置篇开启SSH服务并设置开机自启动修改密码(可选)关闭图形化界面、禁用自动休眠......
  • Git
    Git——分布式版本控制系统简易的命令行入门教程:Git全局设置: gitconfig--globaluser.name"qinyue" gitconfig--globaluser.email"[email protected]"创建git仓库: mkdirtypora-image cdtypora-image gitinit touchREADME.md gitaddREADME.md......
  • 解析后端接口的文件流
    下面使用的是若依框架中的axios请求api:通用importrequestfrom'@/utils/request'exportfunctionguideCome(data){returnrequest({url:'/sys/client/export',method:'post',responseType:&#......
  • 最新 Gitlab配置webhook
    Gitlab配置webhook避坑指南&常见环境问题排查思路与思考总结 前言在之前的CI/CD流程中,我在配置JenkinsJob的“构建触发器”时,采用的都是Gitlab的轮询策略,每10分钟轮询一次Gitlab代码仓库,若有新代码提交,则触发构建、执行代码扫描、运行自动化测试等一系列动作。此种......
  • 使用TortoiseGit(小乌龟)管理gitee和本地代码仓库
    一、安装git二、安装TortoiseGitTortoiseGit(小乌龟)的安装三、创建版本库创建一个文件夹,右键,选择Git在这里创建版本库 点击确定 然后我们就会发现多了一个.git的文件,如果没有的话,把查看-->显示-->隐藏的项目勾选就可以看见了 点击拉取 点击管理远端 ......
  • TortoiseGIt的安装
    一、什么是TortoiseGit?TortoiseGit是一个开放的Git版本控制系统的客户端,为git提供了图形化的操作,操作更加简便 二、下载TortoiseGit官网2.1点击下载图标 2.2找到对应的版本,点击下载 2.3默认是英文,可以根据自己的语言习惯来选择 2.4打开安装程序,点击Next......
  • Gitblit在Windows服务器下搭建及使用
    介绍Gitblit是一个纯Java库用来管理、查看和处理Git资料库。小团队用来管理代码非常合适,既满足私有库的要求,绑定域名后又可基于互联网进行管理。 一、下载官网地址:http://www.gitblit.com/ 二、安装1)配置,进入目录:“C:\Tools\gitblit-1.9.1\data”2)打开defaults.proper......
  • Git使用tag
    1.什么是tag?什么时候应该创建一个tag?项目的版本管理中,每当一个release版本发布时,需要做一个记录,以便以后需要的时候能查找特定的版本,这时候就用到tag这个功能.Git中的tag指向一次commit的id,通常用来给开发分支做一个标记,如标记一个版本号。2.tag和branch有什么区别?branc......
  • vue3 ts 项目文件夹解析
    vue3ts项目文件夹解析layouts文件夹通常用于存放应用程序中的布局组件或布局相关的文件。布局组件是用于包装应用程序中的页面内容的组件,通常包含头部导航、侧边栏、页脚、页面标题等等。布局组件可以在不同的页面中共享,并且可以为应用程序带来一致的外观和体验。core存放......
  • 删除 vs code 中的 github 登录信息
    在Windows系统下,VSCode使用Git存储和管理GitHub登录凭据。默认情况下,Git会使用WindowsCredentialManager存储凭据。要删除存储在其中的GitHub登录信息,请遵循以下步骤:打开“控制面板”(ControlPanel)。点击“用户账户”(UserAccounts)。点击“凭据管理器”(Credenti......