【嵌入式开发基础】git 之 format-patch的使用

2023-10-27

背景介绍

我们在日常的开发中, 涉及对第三方源码的修改或在需要将自己的改动给到其他同事时,经常需要将改动打patch后进行处理.
这时候我们常直接使用diff命令生成patch文件, 然后通过patch进行打对应的patch文件. 详细的使用请看这篇博客中的说明: Linux下生成patch和打patch

然后这种直接使用diff和patch的方式,并不是最优解. 这里会更加建议使用git提供的format-patch 进行patch文件的生成以及通过am进行patch文件的打入. 接下来的示例代码会展示其更优的点

如何使用 git format-patch 和git am
使用git format-patch 生成patch文件

下面以往libchrome这一代码仓库进行文件修改,然后生成patch为例.

➜  libchrome git:(master)ls
Android.bp  build     BUILD.IGNORE  crypto  device  libchrome_tools  MODULE_LICENSE_BSD  NOTICE  soong    testrunner.cc  ui
base        BUILD.gn  components    dbus    ipc     METADATA         mojo                OWNERS  testing  third_party
➜  libchrome git:(master)

如上所示, 时libchrome的一个仓库.
然后我修改了顶层目录中的文件Android.bp, 改动如下:

diff --git a/Android.bp b/Android.bp
index 45392653e..4874aaad0 100644
--- a/Android.bp
+++ b/Android.bp
@@ -38,6 +38,7 @@ package {
 // to attach the license to, and including a comment whether the files may be
 // used in the current project.
 // See: http://go/android-license-faq
+// git format-patch test
 license {
     name: "external_libchrome_license",
     visibility: [":__subpackages__"],
(END)

然后将该改动提交, 操作如下:

➜  libchrome git:(master)git status
On branch master
Your branch is up to date with 'origin/master'.

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

	modified:   Android.bp

no changes added to commit (use "git add" and/or "git commit -a")
➜  libchrome git:(master)git add .
➜  libchrome git:(master)git commit -m "feat: test"
[master bad02e32d] feat: test
 1 file changed, 1 insertion(+)

然后通过git log 查看对应提交的commit id

commit bad02e32d47a8ea82b2bcb02b5e8950f23f61623 (HEAD -> master)
Author: laixiaoqiang <laixiaoqiang@xxxx.com>
Date:   Mon Nov 22 19:49:42 2021 +0800

    feat: test

commit 06d255220dedb1f7058899536fd120bde5e6d904 (tag: android-s-v2-preview-1, origin/master, origin/android-s-v2-preview-1, origin/HEAD)
Merge: 121235bfa 902749c7e
Author: Paul Duffin <paulduffin@google.com>
Date:   Wed Jul 14 23:25:04 2021 +0000

    Stop using deprecated functionality for managing path deps am: 62d44c8c10 am: 902749c7e2
    
    Original change: https://android-review.googlesource.com/c/platform/external/libchrome/+/1761028
    
    Change-Id: Iffea5fa594c77bfae52c2f348a70d6c34dd77a8b

如上图可以得到commit bad02e32d47a8ea82b2bcb02b5e8950f23f61623为我们需要打包为patch的提交.
最后使用git format-patch 命令生成patch文件.

➜  libchrome git:(master) git format-patch bad02e32d47a8ea82b2bcb02b5e8950f23f61623 -1 
0001-feat-test.patch
➜  libchrome git:(master)cat 0001-feat-test.patch 
From bad02e32d47a8ea82b2bcb02b5e8950f23f61623 Mon Sep 17 00:00:00 2001
From: laixiaoqiang <laixiaoqiang@xiaomi.com>
Date: Mon, 22 Nov 2021 19:49:42 +0800
Subject: [PATCH] feat: test

---
 Android.bp | 1 +
 1 file changed, 1 insertion(+)

diff --git a/Android.bp b/Android.bp
index 45392653e..4874aaad0 100644
--- a/Android.bp
+++ b/Android.bp
@@ -38,6 +38,7 @@ package {
 // to attach the license to, and including a comment whether the files may be
 // used in the current project.
 // See: http://go/android-license-faq
+// git format-patch test
 license {
     name: "external_libchrome_license",
     visibility: [":__subpackages__"],
-- 
2.17.1

如上所示有以下几点需要注意:

  1. 使用的命令:
git format-patch bad02e32d47a8ea82b2bcb02b5e8950f23f61623 -1 
   commit id后面跟着的参数-1 指的是当前仅是需要将bad02e32d47a8ea82b2bcb02b5e8950f23f61623这一commit生成patch文件.
  1. 通过 0001-feat-test.patch可以看出, format-patch生成的patch文件有一个有优点是在于记录修改者等git提交信息,以及文件的格式我们更加的熟悉.

那对于这种方式生从的patch文件我们该如何使用呢?
ehh 那让我们先reset bad02e32d47a8ea82b2bcb02b5e8950f23f61623 这一提交,然后进行接下来的演示.

➜  libchrome git:(master)git reset --hard 06d255220dedb1f7058899536fd120bde5e6d904
HEAD is now at 06d255220 Stop using deprecated functionality for managing path deps am: 62d44c8c10 am: 902749c7e2

使用git am命令打对应的patch文件0001-feat-test.patch

➜  libchrome git:(master)git am 0001-feat-test.patch 
Applying: feat: test
➜  libchrome git:(master)

然后通过git log 命令, 可以看到如下提交:

commit 01d340a508c16c4e262bb24c67f991a63db62df1 (HEAD -> master)
Author: laixiaoqiang <laixiaoqiang@xxx.com>
Date:   Mon Nov 22 19:49:42 2021 +0800

    feat: test

commit 06d255220dedb1f7058899536fd120bde5e6d904 (tag: android-s-v2-preview-1, origin/master, origin/android-s-v2-preview-1, origin/HEAD)

可以看出git am 直接将0001-feat-test.patch打入并自动生成提交.
如果只是想生效改动而不需要直接提交代码,可以使用git apply 替代.

➜  libchrome git:(master)git apply 0001-feat-test.patch
➜  libchrome git:(master)git status
On branch master
Your branch is up to date with 'origin/master'.

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

	modified:   Android.bp
补充说明

另外当需要将多个提交生成patch文件,可以使用如下命令,
例如:
libchrom这一代码仓库, 需要将
88c7d5c272925d8f27366ed239a4f46ae00ceb16
f00850730180e5cb6c0b74e58ba9aaab17545b57
生成patch文件.

commit 88c7d5c272925d8f27366ed239a4f46ae00ceb16
Author: Inseob Kim <inseob@google.com>
Date:   Mon Jun 14 12:57:12 2021 +0900

    Add ramdisk_available to init_first_stage's deps
    
    Bug: 187196593
    Test: boot
    Change-Id: I7436b8dd11ca747459d442b3d754c5367a9eb721
    Merged-In: I7436b8dd11ca747459d442b3d754c5367a9eb721

commit f00850730180e5cb6c0b74e58ba9aaab17545b57
Merge: 39896b6f1 ab0b0fa5c
Author: Inseob Kim <inseob@google.com>
Date:   Fri Jun 18 18:14:50 2021 +0000

    Add ramdisk_available to init_first_stage's deps am: 35abebfab5 am: ab0b0fa5c5
    
    Original change: https://android-review.googlesource.com/c/platform/external/libchrome/+/1736238
    
    Change-Id: Ibd8746381ce4518a0195bc70e1cf35406ff3c2c7

commit ab0b0fa5c5b0ecfa6d7f60da3e7b153c4337d4c4
Merge: 6f365e25e 35abebfab
Author: Inseob Kim <inseob@google.com>
Date:   Fri Jun 18 17:57:25 2021 +0000

    Add ramdisk_available to init_first_stage's deps am: 35abebfab5
    
    Original change: https://android-review.googlesource.com/c/platform/external/libchrome/+/1736238
    
    Change-Id: I36a066ceb149a2f6ac00ee81ae8f7fd9742d505e

执行命令如下:

➜  libchrome git:(master)git format-patch ab0b0fa5c5b0ecfa6d7f60da3e7b153c4337d4c4..88c7d5c272925d8f27366ed239a4f46ae00ceb16
0001-Add-ramdisk_available-to-init_first_stage-s-deps.patch
➜  libchrome git:(master) ✗ 
➜  libchrome git:(master)ls
0001-Add-ramdisk_available-to-init_first_stage-s-deps.patch  Android.bp  build     BUILD.IGNORE  crypto  device  libchrome_tools  MODULE_LICENSE_BSD  NOTICE  soong    testrunner.cc  ui
0001-feat-test.patch                                         base        BUILD.gn  components    dbus    ipc     METADATA         mojo                OWNERS  testing  third_party
➜  libchrome git:(master)

可以看出执行该命令后生从了如下两个patch文件, 也就是该两个commit对应的patch.

0001-Add-ramdisk_available-to-init_first_stage-s-deps.patch
0001-feat-test.patch

ehh 这里是两个patch?? 该怎么一次性打入呢?
可以执行如下命令:

git am *.patch // *.patch 需要是patch文件的所在路径

最后需要补充说明的是,git format-patch/ git am 在平台适配时的代码移植时使用比较高效,另外需要注意与bundle/cherry-pick的差异.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【嵌入式开发基础】git 之 format-patch的使用 的相关文章

  • 文本生成视频Make-A-Video,根据一句话就能一键生成视频 Meta新AI模型

    Meta公司 原Facebook 在今年9月29日首次推出一款人工智能系统模型 Make A Video 可以从给定的文字提示生成短视频 Make A Video研究基于文本到图像生成技术的最新进展 该技术旨在实现文本到视频的生成 可以仅用
  • 有序序列的二分查找

    二分算法思想 1 定义下标min指向第一个元素 定义max指向最后一个元素 2 定义下标mid等于 min max 2 3 判断arr mid 是否等于要查找的数 若等于返回mid值 若不等于 如果小于 则min mid 1 如果大于 则m
  • SSH远程访问控制

    目录 一 SSH概述 1 1什么是SSH 1 2SSH的作用 1 3SSH的主程序以及配置文件 二 SSH远程登录方式 2 1ssh 远程主机用户名 远程服务器主机名或IP地址 p port 2 2ssh l 远程主机用户名 远程服务器主机
  • Uboot初次编译、烧写、启动(启动界面log简析)

    目录 U Boot 初次编译 U Boot 烧写与启动 上述笔记第三点就是建立shell脚本实现的 第四点就是修改Makefile文件实现的 下面均有实现步骤讲解 U Boot 初次编译 先编译体验一下正点原子提供的UBOOT 首先在Ubu
  • 刷题之01 矩阵

    给定一个由 0 和 1 组成的矩阵 mat 请输出一个大小相同的矩阵 其中每一个格子是 mat 中对应位置元素到最近的 0 的距离 两个相邻元素间的距离为 1 示例 1 输入 mat 0 0 0 0 1 0 0 0 0 输出 0 0 0 0
  • 阅读文献1:Bootstrapping ViTs: Towards Liberating Vision Transformers from Pre-training(文章翻译及自身的理解和总结)

    目录 前言 一 文章标题 二 摘要 我在这里直接翻译过来 三 Introduction 这里也没有什么好解释哒 我也直接翻译过来 四 Related Work 1 Vision Transformers 2 Knowledge Distil
  • http之GET请求的传递参数的方式

    第一种 直接在URL后面加参数 localhost 21811 Handler1 ashx id 1 name abc 如下图 第二种 用超链接的方法传递参数 当点击超链接的时候 首先会跳转 localhost 21811 Handler1
  • B/S架构及其运行原理 #CSDN博文精选# #IT技术# #软件模式# #架构模式#

    大家好 小C将继续与你们见面 带来精选的CSDN博文 又到周一啦 上周的系统化学习专栏已经结束 我们总共一起学习了20篇文章 这周将开启全新专栏 放假不停学 全栈工程师养成记 在这里 你将收获 将系统化学习理论运用于实践 系统学习IT技术
  • vue导出自定义的excel表格

    1 Vue导出excel 1 1 安装依赖 npm install S file saver npm install S xlsx npm install D script loader 1 2 配置 在项目src文件夹下新建文件夹vend
  • git bash 操作 从github上pull代码再从客户端push上去

    如何将github上的代码拖到本地 1 cd切换目录到对应的仓库 2 git init来初始化这个仓库 3 用ssh keygen t rsa c 邮箱 来设置ssh 然后拷贝到对应的github上设置密钥 4 ls 可以把目录下的文件列出
  • 图文详解丨iOS App上架全流程及审核避坑指南

    目录 目录 引言 一 登录开发者账号注册账号 二 申请证书 描述文件 证书管理 描述文件管理 三 代码实现 四 总结 引言 到了2021年 虽然网上也有大牛写过很多IOS App上架流程资料 但随着苹果发布机制的微调有些 已经过时了 我就趁
  • 【半监督学习】1、Mean Teacher

    文章目录 一 背景 二 方法 三 效果 论文 Mean teachers are better role models Weight averaged consistency targets improvesemi supervised d
  • [ROS学习之路]Ubuntu16.04下使用QT4 + ROS

    1 环境声明 Ubuntu 16 04 ROS kenitic Levi Armstrong大佬已经开发了对应的qt插件 ros qtc plugin使我们能在qt creator上编译ROS程序 这个插件以前使用ppa的方式进行安装 现在
  • java处理图片失真的问题-水印-裁剪-压缩

    问题描述 某些图片 的背景色是透明 但是java 处理后 可能变黑色 其实问题原因就是失真啦 解决办法 BufferedImage image new BufferedImage width height BufferedImage TYP
  • 浅谈VMware Workstation Pro 使用Linux系统(超详细教程)

    Vmware Workstation Pro 使用Linux系统 分割线 目录 VMware Workstation Pro安装 Linux系统镜像下载安装并在VMware Workstation Pro中使用 安装CentOS 查看ip地
  • 可重入锁和不可重入锁的的区别及原理

    锁 把所需要的代码块 资源 或数据锁上 在操作他们的时候只允许一个线程去做操作 不可重入锁 当A方法获取lock锁去锁住一段需要做原子性操作的B方法时 如果这段B方法又需要锁去做原子性操作 那么A方法就必定要与B方法出现死锁 这种会出现问题
  • C语言--用队列实现栈

    用队列实现栈 把数据从队头出来 再插入到队尾 最后一个不插入 直接出栈就实现了出栈操作 取栈顶元素就是获取队尾元素 其余操作入栈 判空 销毁类似于队列操作 可以用一个队列实现栈 也可以用俩队列 我用的一个队列 typedef int typ
  • C++引用

    引用是一个 共享其它变量内存 的变量 我们称这种操作是 引用一个变量 或 给变量取别名 之前说过 变量名称关联变量内存 在变量名前加 符 就可以得到内存地址 而变量名 则 体现 了内存中的数据 而给变量取别名 实际上是把图中的 别名 和内存

随机推荐

  • VSCODE 修改默认编码格式

    VSCODE 修改默认编码格式 快捷键 CTRL SHIFT P 输入Settings 打开设置 找到文件编码格式 ends
  • 【Pytorch】BERT+LSTM+多头自注意力(文本分类)

    Pytorch BERT LSTM 多头自注意力 文本分类 2018年Google提出了BERT 1 Bidirectional Encoder Representations from Transformers 预训练模型 刷新了11项N
  • Java线程之间如何通信的,有哪些方式?

    线程之间的通信方式主要有以下几种 共享变量 线程之间可以通过共享变量来进行通信 不同的线程可以共享同一个变量 并在变量上进行读写操作 需要注意的是 共享变量可能会引发线程安全问题 需要通过同步机制来确保线程安全 锁机制 锁机制是一种常用的线
  • 人称代词的各种形式与用法

    文章目录 代词的主格宾格 物主代词 人称代词的各种形式 反身代词 代词的主格宾格 主格代词 I he she it you we they 例句 I am a teacher He is a teacher You are teachers
  • Skip List(跳表)

    转载自 lotabout me 正文 跳表 skip list 对标的是平衡树 AVL Tree 是一种 插入 删除 搜索 都是 O log n 的数据结构 跳跃表和二叉查找它最大的优势是原理简单 容易实现 方便扩展 效率更高 因此在一些热
  • 帆软报表FineReport中数据连接之Websphere配置JNDI连接

    以oracle9i数据源制作的模板jndi cpt为例来说明如何在FineReport中的Websphere配置JNDI连接 由于常用服务器的JNDI驱动过大 帆软报表FineReport中没有自带 所以可以采取下面的方法来使用服务器中的J
  • Hg修改username和email(提交代码后显示)

    问题如题 方法如下 hg config edit 参考链接 https www mercurial scm org pipermail mercurial devel 2014 February 056666 html
  • 惠普服务器之开启虚拟化功能吗,VT虚拟化是什么?惠普主板怎么开启VT虚拟化?...

    如果想要对惠普品牌主板开启vt虚拟化技术的话 可以先确认自己的电脑是不是支持vt虚拟化功能 如果可以那么在电脑开机的时候可以使用快捷方式进入BIOS设置 详细内容请见下文 什么是VT虚拟化 Intel Virtualization Tech
  • 关于开源的XML Parser expat的介绍和使用心得

    转自 http blog csdn net exclusivepig article details 4566252 expat是使用C所写的XML解释器 采用流的方式来解析XML文件 并且基于事件通知型来调用分析到的数据 并不需要把所有X
  • 薄膜电阻和厚膜电阻有什么区别?

    简介 厚膜电阻主要是指采用厚膜工艺印刷而成的电阻 薄膜电阻稳定性的老化过程因实现不同电阻值所需的薄膜厚度而不同 因此在整个电阻范围内是可变的 此外 改变最佳薄膜厚度还会严重影响 TCR TCR是一个不容忽视的微小参数 它的单位是ppm 1
  • C语言结构体大小计算(超详细,例子丰富,有图)

    看了网上很多关于结构体大小计算的方法 感觉很多讲的不是很清楚 换一种例子就行不通了 我自己也是查阅了很多资料 并且进行了大量的例子验证 总结了一个很好计算结构体大小的方法 直接无脑以下三步即可 1 找到结构体中最大的成员变量所占的字节数 2
  • Java方法的调用(值传递和引用传递)

    系列文章目录 文章目录 系列文章目录 Java方法的调用 一 静态方法 二 非静态方法 三 实际参数和形式参数 四 值传递和引用传递 1 值传递 2 引用传递 Java方法的调用 一 静态方法 静态方法调用 类名 方法名 二 非静态方法 1
  • 计算机网络——传输层

    这篇文章是计算机网络系列文章的第四篇 计算机网络 物理层 计算机网络 数据链路层 计算机网络 网络层 计算机网络 传输层 计算机网络 应用层 序言 计算机网络中的传输层在当今的社会起到了什么作用 计算机网络中的传输层在通信和数据传输方面起着
  • 用户协议html代码,微信小程序同意用户协议确认投稿页面设计制作开发教程

    bookInfo title 作 者 bookInfo author 感谢上传的图书和题目 参与我们的书城建设 加入图书分类小组 搜索QQ群123456 加入出题小组 搜索QQ群123456 同意遵守树芽读书的 用户协议 修订版 用户协议
  • ST-LINK 调试、连线

    硬件连线 只需要三根线 swclk swdio gnd 调试 1 debug st link setting 2 pork sw 确定 3 utilities st link settings reset and run打钩 Add对应的芯
  • vue之自定义一Tree组件编写

    1 实现注意事项 递归组件是可以在它们 己模板中调 自身的组件 Node vue
  • 《数字集成电路静态时序分析基础》笔记⑤

    欢迎关注个人公众号摸鱼范式 目录 标准单元库 时序库概述 非线性延迟模型 延迟模型 非线性模型 Derating参数 时序模型 组合逻辑 时序单元 线延迟 参考书目 网络课程 数字集成电路静态时序分析基础 的笔记 地址 https www
  • PyCharm安装教程

    目录 一 下载 1 官网 2 下载 二 安装 1 下载完成后 直接点击安装包安装 即可 2 开始安装 然后下一步 3 可以在此处自定义地址 然后下一步 4 选择安装选择 然后下一步 5 点击安装 等待片刻 安装完成 三 配置PyCharm
  • 陶哲轩发新论文了,又是AI帮忙的那种

    丰色 发自 凹非寺量子位 公众号 QbitAI 不到一个月的时间 陶哲轩又一篇论文上线 这次是关于欧拉函数的单调非递减序列 他通过初等论证证明了一个名为M x 函数的渐近式 即随着x增大 M x 的行为趋势 该函数在他之前的一篇博客中有所提
  • 【嵌入式开发基础】git 之 format-patch的使用

    背景介绍 我们在日常的开发中 涉及对第三方源码的修改或在需要将自己的改动给到其他同事时 经常需要将改动打patch后进行处理 这时候我们常直接使用diff命令生成patch文件 然后通过patch进行打对应的patch文件 详细的使用请看这