Это хороший способ создать патч?


15

Я хотел бы создать патч из конкретной gccветки, сравнивая его с официальными релизами; поэтому, когда я распаковываю tarball из стабильной версии, я могу применить патч и получить эквивалент того, что было в этой конкретной ветке.

Это первый раз, когда мне нужно создать патч, поэтому я делаю это в первый раз, и моя главная задача - правильно настроить параметры и выполнить синтаксический анализ, поскольку речь идет об очень важной части программного обеспечения.

diff -crB GccStable GccGit > /tmp/fromStabletoBranch.patch

Это достаточно и лучший способ сделать это?


Обычные хорошие практики здесь включают контроль версий или какой-либо их вариант. Это включает в себя mercurial, git и связанные с ними расширения очереди исправлений. Вы могли бы также рассмотреть стеганое одеяло. Возможно, вы могли бы более подробно рассказать о том, что вы пытаетесь сделать?
Фахим Митха

@FaheemMitha что ты имеешь в виду под "более подробной информацией"? У меня есть версия gccиз официальной стабильной tar.bz2и еще одна нестабильная версия из gitрепозитория, я хотел бы создать патч, конечно, я бы хотел сравнить только с masterветкой, а не со всем репозиторием.
user2485710

Хорошо, конечно, вы можете использовать что-то такое простое, как diff. но использование контроля версий обычно предпочтительнее. Во-первых, намного труднее потерять след того, что вы делаете.
Фахим Мита

@FaheemMitha Я не понимаю, что вы предлагаете, мой tar.bz2явно не gitрепозиторий, как вы думаете, я должен продолжить?
user2485710

1
Выполните поиск для «создания патчей с использованием контроля версий». Два предыдущих ответа, которые я написал, связаны между собой: unix.stackexchange.com/a/127810 и unix.stackexchange.com/a/139817
Фахим Митха,

Ответы:


20

Да, это хороший способ создать патч.

Короче говоря:

  1. Для создания патча для одного файла ваша команда может выглядеть так

    diff -Naru file_original file_updated > file.patch

    где

    • -N: обрабатывать отсутствующие файлы как пустые
    • -a: обрабатывать все файлы как текст
    • -r: рекурсивно сравнивать найденные подкаталоги
    • -u: вывести NUM (по умолчанию 3) строки унифицированного контекста
  2. Чтобы создать патч для всего каталога:

    diff -crB dir_original dir_updated > dfile.patch

    где

    • -c: вывести NUM (по умолчанию 3) строки скопированного контекста
    • -r: рекурсивно сравнивать любые подкаталоги
    • -B: игнорировать изменения, все строки которых не заполнены

Ведь чтобы применить этот патч можно запустить

patch -p1 --dry-run < dfile.patch

Параметр where pуказывает, что patch должен удалить префикс пути, чтобы файлы были правильно идентифицированы. В большинстве случаев так и должно быть 1.

Удалите, --dry-runесли вы довольны результатом, напечатанным на экране.


вопрос: что должно произойти, если каталог или файл будут удалены по dir_updatedсравнению с тем, что было в dir_original? Об diffэтом тоже позаботятся или его пропустят?
user2485710 15.10.14

@ user2485710 diff видит, какие файлы были удалены. file.patchпросто в текстовом файле, так что вы можете открыть его в любом редакторе или просто в catнем, и вы увидите строку вродеonly in dir_original: missingfile.txt
jimmij

хорошо, но тогда patchудалит это missingfile.txtили что еще?
user2485710 15.10.14

По-разному. Если вы хотите удалить их, используйте, diff -N ...как в моем первом примере. Обычно patchудаляет пустые файлы по умолчанию. Если вы не хотите, просто используйте только diff -crBкак в вашем вопросе. Также в некоторых (редких) случаях -Eопция в patchкоманде необходима для удаления пустых файлов после руководства по исправлению:if the input is not a context diff or if patch is conforming to POSIX, patch does not remove empty patched files unless this option is given
jimmij

я запустил diff -Naru dir/file dir/file.new > diff.patchполучение can't find file to patch at input line 3с patch -p0 --dry-run < diff.patchпервой строкой патча, читает --- dir/fileвторую +++ dir/file.newс метками времени, разница, кажется, просто правильная, есть ли какая-либо опция, как сообщить точные имена файлов, которые ищет команда?
Ptica
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.