На окнах я создал многофайловую разность с:
svn diff > mydiff.diff
Затем перемещенный это в машину Linux (с той же версией того же repo, никаких изменений). Как стоимость и страхование я применяю его? После выполнения
patch -p0 < mydiff.diff
Я получаю следующий вывод:
patching file licstat/test/unittest/test_licstatactioncontainers.cpp
File licstat/test/unittest/test_licstatactioncontainers.cpp is not empty after patch, as expected
patching file licstat/test/unittest/test_licstatactions.cpp
Hunk #1 FAILED at 99.
1 out of 1 hunk FAILED -- saving rejects to file licstat/test/unittest/test_licstatactions.cpp.rej
can't find file to patch at input line 295
Perhaps you used the wrong -p or --strip option?
The text leading up to this was:
--------------------------
|Index: licstat/test/unittest/test_licenseserverusagemap.cpp
|===================================================================
|--- licstat/test/unittest/test_licenseserverusagemap.cpp (revision 6767)
|+++ licstat/test/unittest/test_licenseserverusagemap.cpp (working copy)
--------------------------
File to patch:
И последняя строка является быстрым ожиданием моего действия.
Как я должен создать/применить патч, чтобы заставить его работать?
(редактирование) Теперь, которое я вижу, что файл отсутствовал и разность, не создало его. После создания файла вручную я получаю ошибки как это:
patching file licstat/misc/generic/mysql/stored_procedures.sql
Hunk #1 FAILED at 220.
Hunk #2 FAILED at 245.
Hunk #3 FAILED at 622.
Hunk #4 FAILED at 661.
Hunk #5 FAILED at 810.
Hunk #6 FAILED at 822.
Hunk #7 FAILED at 868.
Hunk #8 FAILED at 999.
8 out of 8 hunks FAILED -- saving rejects to file licstat/misc/generic/mysql/stored_procedures.sql.rej
Этот тип ошибки может возникнуть, когда формат локального файла - CRLF вместо LF, когда вы находитесь в системе unix.
patch пытается адаптировать патч svn diff к формату файлов unix, но сбивается, когда локальные файлы находятся в режиме dos, что может произойти, когда вы разделяете базы кода между средами dos и unix.
Мне помогает то, что сначала нужно преобразовать все файлы, которые будут затронуты, например:
grep ^+++ patchfile.patch | awk '{print $2}' | dos2unix
А затем применить патч:
patch -p0 < patchfile.patch
Я довольно регулярно переношу файлы между системами windows и mac, и patch
, похоже, правильно справляется с новыми строками, так что я не думаю, что проблема в этом. Похоже, что вы удалили test_licstatactioncontainers.cpp
, и первое предупреждение связано с этим. Второе, похоже, жалуется на то, что не может найти сам файл.
Может ли это быть проблемой регистра имени файла? Windows нечувствительна к регистру имени файла, а linux - нет. Может быть, в linux файл называется Test_LicenceServerUsageMap.cpp? Или каталог LicStat/Test ?
Попробуйте преобразовать окончания строк в файле патча из DOS в Unix, используя команду dos2unix
.