如何应用Perforce补丁?

时间:2012-02-24 10:59:57

标签: diff perforce patch

我前段时间使用p4 diff命令生成了补丁。

但是,现在我想应用它,我意识到没有办法在Perforce中应用补丁。

由于我没有使用-du选项,因此补丁采用了那种模糊的perforce格式,无法与patch(1)一起使用。原来的变化已经丢失。此外,该补丁长度超过300kb,因此手动编辑不是一个真正的选择。

我有什么选择?是否有补丁转换器或某些Perforce扩展允许应用这些补丁?

3 个答案:

答案 0 :(得分:7)

也许Perforce的差异输出格式发生了变化,但@ RumburaK的答案对我来说并不起作用。

我必须修改它以将====标头转换为差异+++---标头格式。

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

答案 1 :(得分:2)

刚刚在修补程序中保存了一些更改并将其还原以便测试一些原始代码之后找到了您的问题...

假设您正在使用一个像样的终端模拟器,这次一次性操作可能需要一个小时左右的时间。

好处是你不能每天都遇到这种情况,因为你现在可能会使用“-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),他们的内容可能不会在差异中打印出来 - 在这种情况下,没有人能够在...中重新修补它们。

答案 2 :(得分:0)

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

来自p4 help diff2

  

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