如何应用Perforce补丁?

20

我之前使用p4 diff命令生成了一个补丁。

但是,现在我想应用这个补丁时发现Perforce没有办法应用补丁。

由于我没有使用-du选项,因此该补丁处于那种晦涩难懂的Perforce格式中,并且不能使用patch(1)来应用。原始更改已经丢失。此外,该补丁超过300kb,手动编辑不是一个真正的选择。

有哪些解决方案?是否有补丁转换器或一些Perforce扩展允许应用这种类型的补丁?


2
相关内容:https://dev59.com/f13Va4cB1Zd3GeqPC68i - slaphappy
1
你可能可以使用sed进行转换。这也是GNU diff的大致格式,因此可能有一些合理的工具可用,保持希望吧,朋友。 - wowest
我正在尝试应用由p4 describe -du保存的补丁。在使用unix patch命令时出现了错误“在补丁输入中只找到了垃圾”。 - Colonel Panic
3个回答

10
也许Perforce的diff输出格式已经改变了,但是@RumburaK的答案对我没有用。我不得不修改它,将====标题转换为diff的+++---标题格式。
sed -Ee 's|==== (//.*)#[0-9]+(.*)|+++ \1\n--- \1|' < infile.txt > outfile.txt

infile.txt是通过以下命令生成的(其中12335是一个被搁置的变更列表):p4 describe -du -S 12345

使用以下命令应用了outfile.txt:patch -p3 -l < outfile.txt


GNU sed 中 -E 的等效选项是 -r(但 GNU sed 也接受 -E,只是没有记录在文档中)。 - Bulletmagnet
你还需要“割掉”describe输出的头部。我是这样做的:p4 describe -du -S <CL number here> | sed -Ee 's|==== //(.*)#[0-9]+(.*)|+++ \1\n--- \1|' | awk '/^+++ /{f=1}f' - TTimo

3

在保存补丁中的一些更改并还原它们以测试原始代码后,发现了您的问题...

假设您使用的是一个不错的终端仿真器,这个一次性操作可能需要花费您大约一个小时左右。

好消息是,您不可能每天都遇到这种情况,因为您现在可能会经常使用“-du”,至少我确定我会。只需按提示复制并粘贴文件名即可:

$ patch -i cucu.diff 
can't find file to patch at input line 2
Perhaps you should have used the -p or --strip option?
The text leading up to this was:
--------------------------
|==== //depot/foo/boo.cpp#1 - /home/who/perforce/foo/boo.cpp ====
--------------------------
File to patch: 

<double-click!> to copy
<middle-click!> to paste

File to patch: /home/who/perforce/foo/boo.cpp <CR>

也许你在补丁中会有100个文件...继续点击 :-)

如果你正在寻找一个替换表达式(vim,sed):

s/.* - \(.*\) ====/+++: \1/

但是,要注意的是,如果您添加了源文件(整个文件,p4 add),它们的内容可能不会在差异中打印出来 - 在这种情况下,没有人能够重新打补丁。


sed -Ee 's/.* - \(.*\) ====/+++: \1/' <in.patch >out.patch' 会出现错误:error: sed: 1: "s/.* - \(.*\) ====/+++: ...": \1 not defined in the RE - Koshmaar
@Koshmaar 这是因为你添加了“-E”。 - sam hocevar
运行得非常好!非常感谢 - 你为我节省了很多时间。 - Alex

1
另一个答案: p4 diff2 命令支持 -u 标志以生成 GNU diff 格式的差异。
来自 p4 help diff2

-u 标志使用 GNU diff -u 格式,仅显示不同的文件。文件名和日期采用 Perforce 语法,但输出可以被 patch 程序使用。


这个解决方案似乎只适用于比较存储库中的两个文件。我如何获得一个GNU补丁,以便比较我的工作文件和存储库中的文件? - Arch D. Robison
p4 diff支持一个统一的diff选项,-du[n] (unified)用于工作区与仓库文件之间的差异比较,但它并不完全符合GNU diff -u格式。过去,我曾经使用它,然后编辑diff输出以使其与GNU patch兼容。 - Jason Spangler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接