У меня на сервере есть файлы, для которых я хотел сделать патч, поэтому я взял один из файлов для тестирования:
cp /path/file ~/file
Итак, теперь у меня есть тот же самый файл в моем корневом каталоге, поэтому я вношу любые необходимые изменения в файл в ~ / file, и теперь я запускаю команду diff для двух файлов:
diff -Nuar /path/file ~/file > my_file.patch
Я также пробовал:
diff -u /path/file ~/file > my_file.patch
diff -c /path/file ~/file > my_file.patch
diff /path/file ~/file > my_file.patch
Теперь, как вы можете видеть, в файлах нет никаких различий, кроме того, что я только что изменил, но вместо создания my_file.patch только с кодом для исправления изменений, которые я внес в / path / file, он всегда создает полный файл с все содержимое / path / file помечено для удаления, а содержимое ~ / file отмечено для добавления.
Затем пытаюсь применить патч:
patch -p0 < ~/my_file.patch
И он терпит неудачу ... он всегда распечатывает файл отклонения со всем содержимым, как и файл.
У меня заканчиваются идеи, почему он делает это все время, с несколькими файлами я могу без проблем создать патч, но с большинством файлов в системе, которые мне нужны, он не будет работать вообще.
Есть идеи, в чем может быть проблема? кодировка, формат? решения?
Возможно ли, что некоторые файлы имеют окончания строки Windows (DOS) вместо новой строки Unix? Попробуйте бежать dos2unix
на них, прежде чем делать diff
.
Обе dos2unix
и fromdos
(в моей системе первый является символической ссылкой на второй) принимает имена файлов в командной строке и выполняет преобразование на месте. Вы можете использовать -b
возможность сделать резервную копию. Если у вас много этих файлов в разных каталогах, вы можете использовать find
обработать их.
find /dir/to/start -type f -name "foo*" -exec fromdos -b {} +
Затем, когда вы будете удовлетворены тем, что все прошло хорошо:
find /dir/to/start -type f -name "foo*.bak" -delete
для удаления резервных копий.
patch
очень чувствителен к своему текущему каталогу и к -p
вариант. Вы уверены, что пытаетесь применить патч из правильного места? Вы указываете префикс (через -p
) что соответствует содержимому вашего файла патча?