精华内容
下载资源
问答
  • patch

    2014-04-13 19:24:29
    git format-patch 自己的工作前的commit号(git log)#从新到老每一次修改生成一个patch文件 git format-patch -n(最近的n次修改) git am patch名 #增加现成的patch git reset --hard commitID #只保留...
    git format-patch 自己的工作前的commit号(git log)#从新到老每一次修改生成一个patch文件
    git format-patch -n(最近的n次修改)


    git am patch名 #增加现成的patch


    git reset --hard commitID #只保留commitID以及之前的修改
    展开全文
  • Patch

    2009-04-18 10:43:00
    [armlinux@lqm patch]$ patch -RE -p0 < test1.patch patching file test0 [armlinux@lqm patch]$ ls test0   test1   test1.patch [armlinux@lqm patch]$ cat test0 111111 111111 111111 ...

     因为在u-boot移植过程中,有几处通用文件要修改,如果每次都要手动修改就太麻烦了。制作补丁可以解决这个问题。

    学习资料的收集比较简单,方法一类似于这种初级问题网上资料非常丰富,google或者baidu搜索一下,然后选择有价值的资料,方法二是阅读man在线文档。完成收集工作,当然最终要在自己的Linux上作实验,比较总结,消化吸收为自己的东西。要除去这么一种错误思想:一定要学全。要知道,一次学全是不可能的,只能先学习最为常用的,在以后不断实践的过程中逐步的丰富,最终达到比较高的水平。把握的原则是:日有所学,学以致用,用以促学。

    首先介绍一下diffpatch。在这里不会把man在线文档上所有的选项都介绍一下,那样也没有必要。在99%的时间里,我们只会用到几个选项。所以必须学会这几个选项。

    1diff

    --------------------

    NAME

           diff - find differences between two files

    SYNOPSIS

           diff [options] from-file to-file

    --------------------

    简单的说,diff的功能就是用来比较两个文件的不同,然后记录下来,也就是所谓的diff补丁。语法格式:diff 【选项】 源文件(夹) 目的文件(夹),就是要给源文件(夹)打个补丁,使之变成目的文件(夹),术语也就是“升级”。下面介绍三个最为常用选项:

    -r 是一个递归选项,设置了这个选项,diff会将两个不同版本源代码目录中的所有对应文件全部都进行一次比较,包括子目录文件。

    -N 选项确保补丁文件将正确地处理已经创建或删除文件的情况。

    -u 选项以统一格式创建补丁文件,这种格式比缺省格式更紧凑些。

    2patch

    ------------------

    NAME

           patch - apply a diff file to an original

    SYNOPSIS

           patch [options] [originalfile [patchfile]]

           but usually just

           patch -pnum <patchfile>

    ------------------

    简单的说,patch就是利用diff制作的补丁来实现源文件(夹)目的文件(夹)的转换。这样说就意味着你可以有源文件(夹)――>目的文件(夹),也可以目的文件(夹)――>源文件(夹)。下面介绍几个最常用选项:

    -p0 选项要从当前目录查找目的文件(夹)

    -p1 选项要忽略掉第一层目录,从当前目录开始查找。

    ************************************************************

    在这里以实例说明:

    --- old/modules/pcitable       Mon Sep 27 11:03:56 1999

    +++ new/modules/pcitable       Tue Dec 19 20:05:41 2000

        如果使用参数-p0,那就表示从当前目录找一个叫做old的文件夹,在它下面寻找modules下的pcitable文件来执行patch操作。

        如果使用参数-p1,那就表示忽略第一层目录(即不管old),从当前目录寻找modules的文件夹,在它下面找pcitable。这样的前提是当前目 录必须为modules所在的目录。而diff补丁文件则可以在任意位置,只要指明了diff补丁文件的路径就可以了。当然,可以用相对路径,也可以用绝 对路径。不过我一般习惯用相对路径。

    ************************************************************

    -E  选项说明如果发现了空文件,那么就删除它

    -R  选项说明在补丁文件中的文件和文件现在要调换过来了(实际上就是给新版本打补丁,让它变成老版本)

    下面结合具体实例来分析和解决,分为两种类型:为单个文件打补丁和为文件夹内的多个文件打补丁。

    环境:在RedHat 9.0下面以armlinux用户登陆。

    目录树如下:

    |-- bootloader

    |-- debug

    |-- images

    |-- kernel

    |-- program

    |-- rootfiles

    |-- software

    |-- source

    |-- sysapps

    |-- tmp

    `-- tools

    下面在program文件夹下面建立patch文件夹作为实验用,然后进入patch文件夹。

    一、为单个文件进行补丁操作

    1、建立测试文件test0test1

    [armlinux@lqm patch]$ cat  >>test0<<EOF

    > 111111

    > 111111

    > 111111

    > EOF

    [armlinux@lqm patch]$ more test0

    111111

    111111

    111111

    [armlinux@lqm patch]$ cat >>test1<<EOF

    > 222222

    > 111111

    > 222222

    > 111111

    > EOF

    [armlinux@lqm patch]$ more test1

    222222

    111111

    222222

    111111

    2、使用diff创建补丁test1.patch

    [armlinux@lqm patch]$ diff -uN test0 test1 > test1.patch

    【注:因为单个文件,所以不需要-r选项。选项顺序没有关系,即可以是-uN,也可以是-Nu。】

    [armlinux@lqm patch]$ ls

    test0  test1  test1.patch

    [armlinux@lqm patch]$ more test1.patch

    ************************************************************

    patch文件的结构

    补丁头

    补丁头是分别由---/+++开头的两行,用来表示要打补丁的文件。---开头表示旧文件,+++开头表示新文件。

    一个补丁文件中的多个补丁

    一个补丁文件中可能包含以---/+++开头的很多节,每一节用来打一个补丁。所以在一个补丁文件中可以包含好多个补丁。

    块是补丁中要修改的地方。它通常由一部分不用修改的东西开始和结束。他们只是用来表示要修改的位置。他们通常以@@开始,结束于另一个块的开始或者一个新的补丁头。

    块的缩进

    块会缩进一列,而这一列是用来表示这一行是要增加还是要删除的。

    块的第一列

    +号表示这一行是要加上的。

    -号表示这一行是要删除的。

    没有加号也没有减号表示这里只是引用的而不需要修改。

    ************************************************************

    ***diff命令会在补丁文件中记录这两个文件的首次创建时间,如下***

    --- test0       2006-08-18 09:12:01.000000000 +0800

    +++ test1       2006-08-18 09:13:09.000000000 +0800

    @@ -1,3 +1,4 @@

    +222222

     111111

    -111111

    +222222

     111111

    [armlinux@lqm patch]$ patch -p0 < test1.patch

    patching file test0

    [armlinux@lqm patch]$ ls

    test0  test1  test1.patch

    [armlinux@lqm patch]$ cat test0

    222222

    111111

    222222

    111111

    3、可以去除补丁,恢复旧版本

    [armlinux@lqm patch]$ patch -RE -p0 < test1.patch

    patching file test0

    [armlinux@lqm patch]$ ls

    test0  test1  test1.patch

    [armlinux@lqm patch]$ cat test0

    111111

    111111

    111111

    二、为多个文件进行补丁操作

    1、创建测试文件夹

    [armlinux@lqm patch]$ mkdir prj0

    [armlinux@lqm patch]$ cp test0 prj0

    [armlinux@lqm patch]$ ls

    prj0  test0  test1  test1.patch

    [armlinux@lqm patch]$ cd prj0/

    [armlinux@lqm prj0]$ ls

    test0

    [armlinux@lqm prj0]$ cat >>prj0name<<EOF

    > --------

    > prj0/prj0name

    > --------

    > EOF

    [armlinux@lqm prj0]$ ls

    prj0name  test0

    [armlinux@lqm prj0]$ cat prj0name

    --------

    prj0/prj0name

    --------

    [armlinux@lqm prj0]$ cd ..

    [armlinux@lqm patch]$ mkdir prj1

    [armlinux@lqm patch]$ cp test1 prj1

    [armlinux@lqm patch]$ cd prj1

    [armlinux@lqm prj1]$ cat >>prj1name<<EOF

    > ---------

    > prj1/prj1name

    > ---------

    > EOF

    [armlinux@lqm prj1]$ cat prj1name

    ---------

    prj1/prj1name

    ---------

    [armlinux@lqm prj1]$ cd ..

    2、创建补丁

    [armlinux@lqm patch]$ diff -uNr prj0 prj1 > prj1.patch

    [armlinux@lqm patch]$ more prj1.patch

     

    diff -uNr prj0/prj0name prj1/prj0name

    --- prj0/prj0name       2006-08-18 09:25:11.000000000 +0800

    +++ prj1/prj0name       1970-01-01 08:00:00.000000000 +0800

    @@ -1,3 +0,0 @@

    ---------

    -prj0/prj0name

    ---------

    diff -uNr prj0/prj1name prj1/prj1name

    --- prj0/prj1name       1970-01-01 08:00:00.000000000 +0800

    +++ prj1/prj1name       2006-08-18 09:26:36.000000000 +0800

    @@ -0,0 +1,3 @@

    +---------

    +prj1/prj1name

    +---------

    diff -uNr prj0/test0 prj1/test0

    --- prj0/test0  2006-08-18 09:23:53.000000000 +0800

    +++ prj1/test0  1970-01-01 08:00:00.000000000 +0800

    @@ -1,3 +0,0 @@

    -111111

    -111111

    -111111

    diff -uNr prj0/test1 prj1/test1

    --- prj0/test1  1970-01-01 08:00:00.000000000 +0800

    +++ prj1/test1  2006-08-18 09:26:00.000000000 +0800

    @@ -0,0 +1,4 @@

    +222222

    +111111

    +222222

    +111111

     

    [armlinux@lqm patch]$ ls

    prj0  prj1  prj1.patch  test0  test1  test1.patch

    [armlinux@lqm patch]$ cp prj1.patch ./prj0

    [armlinux@lqm patch]$ cd prj0

    [armlinux@lqm prj0]$ patch -p1 < prj1.patch

    patching file prj0name

    patching file prj1name

    patching file test0

    patching file test1

    [armlinux@lqm prj0]$ ls

    prj1name  prj1.patch  test1

    [armlinux@lqm prj0]$ patch -R -p1 < prj1.patch

    patching file prj0name

    patching file prj1name

    patching file test0

    patching file test1

    [armlinux@lqm prj0]$ ls

    prj0name  prj1.patch  test0

    -------------------

    总结一下:

    单个文件

    diff –uN  from-file  to-file  >to-file.patch

    patch –p0 < to-file.patch

    patch –RE –p0 < to-file.patch

    多个文件

    diff –uNr  from-docu  to-docu  >to-docu.patch

    patch –p1 < to-docu.patch

    patch –R –p1 <to-docu.patch

    -------------------

    三、应用

    为内核打补丁。前面在创建交叉编译工具链时,其中有一步就是为内核打补丁。当时还不是特别了解,现在很清晰了。参考前面的文章《基于ARM+Linux嵌入式开发的开发工具链的建立》。

    1、首先是解压,因为发布的补丁文件都是使用gzip压缩的。

    $gunzip ../setup-dir/ patch-2.4.21-rmk1.gz

    2、然后进入你的内核源代码目录

    $cd linux-2.4.21

    3、打补丁

    $patch –p1 < ../../setup-dir/patch-2.4.21-rmk1

           打完补丁后,需要检查一下有没有拒绝执行的文件,即检查.rej文件的存在。使用命令:

           $find  .  -name  *.rej

           如果发现,会将其输出到标准输出终端,默认屏幕。当然,你也可以采用重定向,输出到指定文件,比如reject。

           $fine  .  -name  *.rej  >reject

           然后可以查看reject的内容了。

    展开全文
  • 生成patch和打patch

    千次阅读 2019-06-17 19:41:31
    本身Linux命令里有diff和patch两个命令可以生成patch和打patch 单个文件 diff -uN ori-file mdf-file > mdf-file.patch // 生成patch文件 patch -p0 < mdf-file.patch // 将patch修改应用到源代码 patch -RE ...

    本身Linux命令里有diff和patch两个命令可以生成patch和打patch

    单个文件

    diff -uN  ori-file  mdf-file  > mdf-file.patch // 生成patch文件
    patch -p0 < mdf-file.patch // 将patch修改应用到源代码
    patch -RE -p0 < mdf-file.patch // 回退patch的修改
    

    多个文件

    diff -uNr  ori-dir  mdf-dir > mdf-dir.patch
    patch -p1 < mdf-dir.patch
    patch -R -p1 < mdf-dir.patch
    

    使用git的format-patch和am命令进行生成patch和打patch

    用此方法获得的patch其实就是commit里提交的code修改以及commit信息,能够灵活的获取patch。可以获取任意两个commit之间的patch集。

    使用方法(直接给一些examples):

    git format-patch
    $ git format-patch HEAD^                  #生成最近的1次commit的patch
    $ git format-patch HEAD^^                 #生成最近的2次commit的patch
    $ git format-patch HEAD^^^                #生成最近的3次commit的patch
    $ git format-patch HEAD^^^^               #生成最近的4次commit的patch
    $ git format-patch <r1>..<r2>             #生成两个commit间的修改的patch(包含两个commit. <r1>和<r2>都是具体的commit号)
    $ git format-patch -1 <r1>                #生成单个commit的patch
    $ git format-patch <r1>                   #生成某commit以来的修改patch(不包含该commit)
    $ git format-patch --root <r1>            #生成从根到r1提交的所有patch
    
    git am
    $ git apply --stat 0001-limit-log-function.patch           # 查看patch的情况
    $ git apply --check 0001-limit-log-function.patch          # 检查patch是否能够打上,如果没有任何输出,则说明无冲突,可以打上
    (注:git apply是另外一种打patch的命令,其与git am的区别是,git apply并不会将commit message等打上去,打完patch后需要重新git add和git commit,而git am会直接将patch的所有信息打上去,而且不用重新git add和git commit,author也是patch的author而不是打patch的人)
    $ git am 0001-limit-log-function.patch                     # 将名字为0001-limit-log-function.patch的patch打上
    $ git am --signoff 0001-limit-log-function.patch           # 添加-s或者--signoff,还可以把自己的名字添加为signed off by信息,作用是注明打patch的人是谁,因为有时打patch的人并不是patch的作者
    $ git am ~/patch-set/*.patch                               # 将路径~/patch-set/*.patch 按照先后顺序打上
    $ git am --abort                                           # 当git am失败时,用以将已经在am过程中打上的patch废弃掉(比如有三个patch,打到第三个patch时有冲突,那么这条命令会把打上的前两个patch丢弃掉,返回没有打patch的状态)
    $ git am --resolved                                        # 当git am失败,解决完冲突后,这条命令会接着打patch
    
    如果打Patch的过程中发生了冲突(conflicts),怎么办?

    解决patch冲突的过程是:
    如果不想打这一系列patch了,直接:git am --abort。
    如果还想打, 有两种解决方案:
    方案一(个人推荐):
    (1) 根据git am失败的信息,找到发生冲突的具体patch文件,然后用命令git apply --reject <patch_name>,强行打这个patch,发生冲突的部分会保存为.rej文件(例如发生冲突的文件是a.txt,那么运行完这个命令后,发生conflict的部分会保存为a.txt.rej),未发生冲突的部分会成功打上patch
    (2) 根据.rej文件,通过编辑该patch文件的方式解决冲突。
    (3) 废弃上一条am命令已经打了的patch:git am --abort
    (4) 重新打patch:git am ~/patch-set/*.patchpatch
    方案二:
    (1) 根据git am失败的信息,找到发生冲突的具体patch文件,然后用命令git apply --reject <patch_name>,强行打这个patch,发生冲突的部分会保存为.rej文件(例如发生冲突的文件是a.txt,那么运行完这个命令后,发生conflict的部分会保存为a.txt.rej),未发生冲突的部分会成功打上patch
    (2) 根据.rej文件,通过编辑发生冲突的code文件的方式解决冲突。
    (3) 将该patch涉及到的所有文件(不仅仅是发生冲突的文件)通过命令git add <file_name>添加到工作区中
    (4) 告诉git冲突已经解决,继续打patch: git am --resolved (git am --resolved 和 git am --continue是一样的)

    分析:方案一和方案二主要区别是解决冲突的方法不一样。方案一是通过编辑patch文件的方式解决冲突,方案二是通过编辑冲突code文件的方式解决冲突。这两种方案区别比较大:经过实验,核心区别在于,方案二无法验证冲突有没有切实的解决。即使你在方案二的第二步乱改一通,也能“打完”发生冲突的patch(并没有检测修改后的code文件跟patch期望的是否相同)。因此,如果采用方案二,那么再解决code文件冲突后,需要人工去确认修改的正确性。

    参考:https://www.cnblogs.com/ArsenalfanInECNU/p/8931377.html

    展开全文
  • svn patch

    2020-12-23 16:41:16
    svn patch svn 在windows环境下生成patch,将patch应用到linux环境下时 patch -p0 < demo.patch 出现错误: (Stripping trailing CRs from patch; use --binary to disable.) 需要做去cr的操作: tr -d '\r' &...

    svn patch


    svn 在windows环境下生成patch,将patch应用到linux环境下时

    patch -p0 < demo.patch
    

    出现错误:

    (Stripping trailing CRs from patch; use --binary to disable.)
    

    需要做去cr的操作:

    tr  -d   '\r'    <demo.patch>    tmp.patch
    rm demo.patch
    mv tmp.patch demo.patch
    
    展开全文
  • 在程序员的日常开发与合作过程中,对于code的生成patch和打patch(应用patch)成为经常需要做的事情。使用方法(直接给一些examples):1.生成patch1.1 git diff > xxx.patch#只想 patch Test.java 文件git diff Test...
  • git am PATCH

    2016-09-23 11:00:34
    patch
  • 如何使用git 生成patch 和打入patch

    万次阅读 多人点赞 2017-01-13 17:36:39
    平时我们在使用git 管理项目的时候,会遇到这样一种情况,那就是客户使用git 生成patch 给到我们,那我们就需要把客户给到patch 打入到我们的project ,基于这样一个场景,我把git 如何生成patch 和如何打入patch 做...
  • git生成patch和打入patch

    2020-11-22 17:41:23
    git生成patch 使用git format-patch HEAD^将最后一次提交生成patch 使用git format-patch [HEAD号]可以从当前到HEAD的提交全部打包 git检查patch git打入patch 遇到的问题参考 ...
  • Git 生成patch和打patch

    2020-06-03 14:24:06
    Git 生成patch和打patch 尽管本身Linux命令里有diff和patch两个命令可以生成patch和打patch。但是有两个缺点值得注意: 对单个文件或者多个文件,diff和patch这两个文件比较方便。对于git这种以project为单位的...
  • Git生成patch及打patch到源代码

    千次阅读 2020-09-18 20:50:34
    1.每个commit生成1个patch 2.多个commit生成1个patch 3.如何运用生成的patch打回源代码
  • Git patch

    2020-10-22 13:44:08
    git format-patch适用于git的patch,包含diff信息,包含提交人,提交时间等 如果生成的补丁不能打到当前分支,git am会给出提示,并协助你完成打补丁工作 对比分支生成patch 例:从master checkout 一个新分支修改...
  • git patch

    2020-04-09 14:25:02
    在程序员的日常开发与合作过程中,对于code的生成patch和打patch(应用patch)成为经常需要做的事情。 什么是patch?简单来讲,patch中存储的是你对代码的修改 什么是生成patch?生成patch就是记录你对代码的修改并将其...
  • Android Studio生成patch和使用patch

    千次阅读 2020-04-25 17:44:56
    1. 生成patch 选择想保存的patch文件的位置,点击ok保存patch文件。 至此patch文件已经生成了(打patch成功了)。 2. 使用patch
  • patchmatch

    热门讨论 2014-02-14 17:05:24
    09年patchmatch以及07年space time video completion的代码
  • 在程序员的日常开发与合作过程中,对于code的生成patch和打patch(应用patch)成为经常需要做的事情。 什么是patch?简单来讲,patch中存储的是你对代码的修改 什么是生成patch?生成patch就是记录你对代码的修改并将其...
  • patch

    2020-03-28 09:01:49
    patch是某一次提交给文件内容的改变,打patch是将某一次改变的内容应用到当前的版本库。 常规操作 # 生成patch git diff ./ > xxx.patch #将差异的内容制作成patch mkdir update && git diff commit-id-...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 126,476
精华内容 50,590
关键字:

patch