Це хороший спосіб створити патч?


15

Я хотів би створити виправлення з певної gccгілки, порівнюючи його з офіційними випусками; тому, коли я розпаковую тарбол зі стабільного випуску, я можу застосувати виправлення та отримати еквівалент того, що було у цій конкретній гілці.

Мені вперше потрібно створити виправлення, тому я вперше це роблю, і моя головна проблема - отримати варіанти та синтаксичний аналіз, оскільки ми говоримо про надзвичайно важливу частину програмного забезпечення

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

Це достатньо і найкращий спосіб зробити це?


Звичайні добрі практики тут включають контроль версій або якийсь їх варіант. Це включає в себе, mercurial, git та пов'язані з ними розширення черги патчів. Ви також можете розглянути ковдру. Можливо, ви могли б детальніше розібратися, що ви намагаєтеся зробити?
Faheem Mitha

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

Добре, звичайно, ви можете використовувати щось таке просте, як розл. але використання контролю версій, як правило, краще. По-перше, набагато важче втратити слід від того, що ти робиш.
Faheem Mitha

@FaheemMitha Я не розумію, що ти пропонуєш, моє tar.bz2явно не gitсховище, як ти думаєш, що мені робити далі?
користувач2485710

1
Здійсніть пошук "створення патчів за допомогою контролю версій". Два попередніх відповідей я написав , що пов'язані є unix.stackexchange.com/a/127810 і unix.stackexchange.com/a/139817
Фахім Mitha

Відповіді:


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

де перемикач pвказує патч зняти префікс шляху, щоб файли були ідентифіковані правильно. У більшості випадків так і має бути 1.

Видаліть, --dry-runякщо ви задоволені результатом, надрукованим на екрані.


питання: що повинно статися, якщо каталог або файл буде видалено в dir_updatedпорівнянні з тим, що там було dir_original? diffПіклується про те , що занадто або вона буде пропущена?
користувач2485710

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

добре, але потім patchвидалить те missingfile.txtчи що ще?
користувач2485710

Це залежить. Якщо ви хочете видалити їх, використовуйте, 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

0

Якщо ви хочете порівняти останній git checkin з стабільною версією, просто перейдіть git diff the-stable-version(потрібно буде з'ясувати, який тег описує його, можливо, точний номер версії чи якийсь варіант) у сховищі. gitзберігає повну історію проекту (зазвичай є способи захопити лише частину). Не має значення, чи the-stable-versionє в якійсь іншій галузі розвитку (тобто, розробка відключилася, а стабільна гілка отримала деякі виправлення в останню хвилину).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.