如果有许多贴片有拒绝,“补丁”对“.rej”文件有什么作用?

时间:2016-07-12 22:14:27

标签: git patch

我将申请大约305个补丁,我知道会有很多“拒绝”。

在我这样做之前,我想知道如果patch文件已经存在,.rej会做什么,,因为我完全希望它会。< / p>

我的替代方法是使用--merge,这会为<<<...>>>用户创建git标签。 (嘿......)但在这种情况下,我担心这些标签的存在,如果有很多标签,可能会影响将来的修补。

(关于哪一个可能最好的任何意见?)

我基本上计划“在for循环中应用补丁,让他们尽力而为,然后进行清理。” (它有望成为一个令人愉快的下午。)我知道我将这一步非常手动,我还不知道那里有多少.rej个文件可能。 (我已经可以看到,将会有超过100个。)

欢迎战争故事。

2 个答案:

答案 0 :(得分:1)

patch只会覆盖现有的.rej文件。但您可以将拒绝发送到您选择的文件using the -r option

  

-r rejectfile --reject-file= rejectfile

     

将拒绝放入 rejectfile 而不是默认的.rej文件。什么时候    rejectfile -,弃用拒绝。

请注意,在这种情况下,不同文件的被拒绝的人都会以统一的差异格式放入同一个文件中。

因此,您可以编写循环以在每次迭代时使用不同的拒绝文件:

for p in patch*
do
    patch -p0 -r "$p".rej <"$p" 
done

但是,我的建议是,即使单个块被拒绝也要立即停止修补过程,并在继续之前解决冲突。您可以在修补循环中对该逻辑进行编码,类似于以下内容:

<强> apply_patches

#!/bin/bash

for p in "$@"
do
    echo
    echo "----------- Applying patch $p ------------"
    rejectfile="$p".rej
    patch -p0 -r "$rejectfile" <"$p"
    if [ -s "$rejectfile" ]
    then
        echo
        echo "Some hunks could not be applied (see $rejectfile)"
        read -p "Please address them and then press ENTER "
    fi
done

答案 1 :(得分:0)

现在记录这一努力的结果:

是的,patch会覆盖.rej个文件,Leon的建议脚本是我非常好的起点。但是,我发现.rej文件的内容对我来说基本上没用。重新阅读patch文档(在 Linux 上,但在Macintosh OS / X上没有(!)),我看到有{{1} }}选项可以对文件进行--merge修改(正如<<<< ==== >>>>常规做的那样...)

我使用git命令获取提交列表作为单独的补丁文件,并修改了Leon的原始脚本以循环遍历该目录的内容。

我没有像Leon建议的那样使用git format-patch选项,而是使用了-r选项。由于现在没有要测试的拒绝文件,我更改了脚本以使用--merge命令的退出代码("$?")。 (像往常一样,“零等于成功。”)

如果patch命令成功(返回零...),我的脚本会将补丁文件patch放入另一个“已应用补丁”目录中。如果没有,它会打印一条消息并停止。我通过以下方式解决了每个问题:

  • 逐个注意补丁中的哪些文件有错误。打开其中每个文件并搜索mv标记。通过这种方式,我可以并排看到两个替代方案,并且,逐个案例,我做了个人选择和手动修正。

  • 然后,将<<<<<补丁文件发送到“已应用补丁”目录,就像脚本本应完成的那样,补丁已完全应用而没有错误。

  • 使用我设计的自定义工具扫描(PHP ...) source-directory以查找任何语法错误。立即(!)解决发现的任何问题。

  • mv更改......以防万一!

  • 再次启动脚本...

现在,一个有趣的问题。 。

现在,正如我在原帖中所说,我将这些(数百个......)补丁应用于源代码库,该代码库已经从文本中复制了好几个月。 (在拆分时,git commit存储库甚至没有存在。该公司仍在使用SVN。)因此,git几乎从未能够依赖在线号上。

在每种情况下,patch 确实找到了 以为它找到了正确的位置来应用每个补丁,在线路的某个“偏移”处 - 补丁中列出的号码。 然而,我发现在某些情况下patch 没有(!)正确识别所有内容。有时,它会在相同的现有代码前面标记“插入”,人类会认识到它根本不是插入。

我当然是在这个时刻“焦急地希望”在每种情况下patch “认识到自己的不确定性”,因此没有“成功应用”补丁(大约三分之二,事实证明......)将证明存在重复问题。 (这是我们经常在代码库中的任何地方检查语法错误的主要原因之一,并且,实际上,几乎从未找到任何语法错误。)