diff и patch, используя неправильный конец строки при создании новых файлов или конец строки изменен

Я пытаюсь создать патч с помощью diff, но я не могу заставить патч использовать символы конца строки, используемые в файлах при создании нового файла, или изменить окончание строки, когда файл изменяет его. В основном я делаю:

cp -r dir1 dir3
diff -ruN dir1 dir2 > dir3\patch.txt
cd dir3
patch -p1 < patch.txt

Все изменения между dir1 и dir2 применяются правильно, за исключением того, что символ конца строки для новых файлов по умолчанию равен CR+LF, даже если файл в dir2 использует LF в качестве маркера конца строки. Кроме того, любые файлы, в которых разница между ними заключается только в изменении конца строки, никаким образом не исправляются - diff, похоже, не видит никаких изменений.

Таким образом, запуск diff -rq dir2 dir3 дает кучу Files aaa and bbb differ, но diff -rwq dir2 dir3 работает нормально.

Я использую diff - GNU diffutils version 2.7 и patch 2.5 из UnxUtils в Windows XP.

Есть ли способ сделать так, чтобы новые и измененные файлы, включенные в патч, сохранили строку, заканчивающуюся на исходном файле?


person Jordan Evens    schedule 14.07.2011    source источник


Ответы (1)


Это работает:

cp -r dir1 dir3
diff --binary -ruN dir1 dir2 > dir3\patch.txt
cd dir3
patch --no-backup-if-mismatch --binary -u -p1 < patch.txt

Отсутствие флага --binary означает, что файл анализируется построчно, без учета EOL. По какой-то причине он не всегда исправляет чисто (выдает сообщение Hunk #1 succeeded at 1 with fuzz 1.), поэтому мне пришлось включить --no-backup-if-mismatch, чтобы предотвратить создание .orig файлов. -u кажется необязательным, поскольку патч сам определит тип патча.

person Jordan Evens    schedule 13.09.2011