web-dev-qa-db-ja.com

PERFORCEパッチを適用する方法は?

少し前に_p4 diff_コマンドを使用してパッチを生成しました。

しかし、適用したいので、PERFORCEでパッチを適用する方法がないことに気づきました。

_-du_オプションを使用しなかったため、パッチはそのあいまいなPERFORCE形式であり、patch(1)では適用できません。元の変更は失われました。また、そのパッチの長さは300kbを超えているため、手動編集は実際にはオプションではありません。

私のオプションは何ですか?パッチコンバーター、またはこれらの種類のパッチの適用を可能にするいくつかのPERFORCE拡張機能はありますか?

16
slaphappy

おそらく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

8
Jason Spangler

元のコードのいくつかをテストするために、パッチに私の変更のいくつかを保存し、それらを元に戻した後、あなたの質問を見つけました...

適切なターミナルエミュレータを使用していると仮定すると、この1回の操作には最大1時間ほどかかる場合があります。

良いことは、これからはおそらく「-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個のファイルが含まれているでしょう...クリックし続けてください:-)

Subst式(vim、sed)を探している場合:

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

ただし、ソース(ファイル全体、p4 add)を追加した場合、それらのコンテンツはおそらく差分に出力されないことに注意してください。その場合、誰もそれらを再パッチすることはできません...

3
RumburaK

別の答え:p4 diff2コマンドは-uフラグをサポートして、GNU diff形式でdiffを生成します。

p4 help diff2から:

-uフラグはGNU diff -u形式を使用し、異なるファイルのみを表示します。ファイル名と日付はPERFORCE構文ですが、出力はパッチプログラムで使用できます。

1
Jason Spangler