2012-02-24 4 views
15

Я сгенерировал патч некоторое время назад, используя команду p4 diff.Как применить патч Perforce?

Однако, теперь, когда я хочу применить его, я понимаю, что в Perforce нет возможности применить патч.

Поскольку я не использовал опцию -du, патч находится в этом неясном формате perforce и не может быть применен с patch(1). Исходные изменения были потеряны. Кроме того, этот патч имеет длину более 300 КБ, поэтому ручное редактирование на самом деле не является вариантом.

Какие у меня варианты? Существуют ли преобразователи патчей или некоторые расширения Perforce, позволяющие применять такие патчи?

+2

Связанный: http://stackoverflow.com/questions/8289306/perforce-diff-to-git – slaphappy

+1

вы, вероятно, может конвертировать с СЭД. это также грубый формат от gnu diff, так что, вероятно, есть некоторые разумные инструменты, поддерживайте надежду на живого друга. – wowest

+0

Я пытаюсь применить патч, сохраненный ['p4 описать -du'] (https://www.perforce.com/perforce/doc.current/manuals/cmdref/p4_describe.html). Это дает сообщение об ошибке с командой unix patch: «Только мусор был найден во входе патча». –

ответ

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 добавить), их содержание, вероятно, не будет напечатано в диффе - в этом случае никто не сможет повторно исправить их в ...

+0

'sed -Ee's /.* - \ (. * \) ====/+++: \ 1/' out.patch' дает 'error: sed: 1:" s /.* - \ (. * \) ====/+++: ... ": \ 1, не определенный в RE' – Koshmaar

+0

@ Кошмаар, это происходит потому, что вы добавили '-E'. –

+0

Работал как шарм! Большое спасибо - вы спасли меня много времени. – Alex

6

Возможно, формат выходных данных 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

+0

GNU sed эквивалент '-E' является' -r' (но GNU sed принимает '-E', не документируя его) – Bulletmagnet

0

Другого ответа: p4 diff2 команда поддерживает флаг -u для генерации различий в формате GNU diff.

От p4 help diff2:

The -u flag uses the GNU diff -u format and displays only files that differ. The file names and dates are in Perforce syntax, but the output can be used by the patch program.

+0

Это решение, похоже, работает только при сравнении двух файлов, находящихся в репозитории. Как я могу получить патч GNU для разницы между моим рабочим файлом и файлом в репозитории? –

+0

p4 diff поддерживает унифицированную опцию diff, '' '-du [n] (унифицированный)' '' для работы с файлами diff vs, но не полностью в формате GNU diff -u. Раньше я использовал его, а затем редактировал вывод diff, чтобы он работал с плагином GNU. –

Смежные вопросы