我将申请大约305个补丁,我知道会有很多“拒绝”。
在我这样做之前,我想知道如果patch
文件已经存在,.rej
会做什么,,因为我完全希望它会。< / p>
我的替代方法是使用--merge
,这会为<<<...>>>
用户创建git
标签。 (嘿......)但在这种情况下,我担心这些标签的存在,如果有很多标签,可能会影响将来的修补。
(关于哪一个可能最好的任何意见?)
我基本上计划“在for
循环中应用补丁,让他们尽力而为,然后进行清理。” (它有望成为一个令人愉快的下午。)我知道我将这一步非常手动,我还不知道那里有多少.rej
个文件可能。 (我已经可以看到,将会有超过100个。)
欢迎战争故事。
答案 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
“认识到自己的不确定性”,因此没有“成功应用”补丁(大约三分之二,事实证明......)将证明存在重复问题。 (这是我们经常在代码库中的任何地方检查语法错误的主要原因之一,并且,实际上,几乎从未找到任何语法错误。)