我之前使用p4 diff
命令生成了一个补丁。
但是,现在我想应用这个补丁时发现Perforce没有办法应用补丁。
由于我没有使用-du
选项,因此该补丁处于那种晦涩难懂的Perforce格式中,并且不能使用patch(1)
来应用。原始更改已经丢失。此外,该补丁超过300kb,手动编辑不是一个真正的选择。
有哪些解决方案?是否有补丁转换器或一些Perforce扩展允许应用这种类型的补丁?
====
标题转换为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
-E
的等效选项是 -r
(但 GNU sed 也接受 -E
,只是没有记录在文档中)。 - Bulletmagnetp4 describe -du -S <CL number here> | sed -Ee 's|==== //(.*)#[0-9]+(.*)|+++ \1\n--- \1|' | awk '/^+++ /{f=1}f'
- TTimo在保存补丁中的一些更改并还原它们以测试原始代码后,发现了您的问题...
假设您使用的是一个不错的终端仿真器,这个一次性操作可能需要花费您大约一个小时左右。
好消息是,您不可能每天都遇到这种情况,因为您现在可能会经常使用“-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
。 - Koshmaarp4 diff2
命令支持 -u
标志以生成 GNU diff 格式的差异。p4 help diff2
:
-u 标志使用 GNU diff -u 格式,仅显示不同的文件。文件名和日期采用 Perforce 语法,但输出可以被 patch 程序使用。
-du[n] (unified)
用于工作区与仓库文件之间的差异比较,但它并不完全符合GNU diff -u格式。过去,我曾经使用它,然后编辑diff输出以使其与GNU patch兼容。 - Jason Spangler
p4 describe -du
保存的补丁。在使用unix patch命令时出现了错误“在补丁输入中只找到了垃圾”。 - Colonel Panic