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

15

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

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

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

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

user2485710
источник
Обычные хорошие практики здесь включают контроль версий или какой-либо их вариант. Это включает в себя 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если вы довольны результатом, напечатанным на экране.

jimmij
источник
вопрос: что должно произойти, если каталог или файл будут удалены по 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