Как применить файл patch git

Обновлено: 07.07.2024

Добавить новый удалённый репозиторий:
git remote add <remote-name> <remote-path>

Установить ветку из удалённого репозитория в качестве апстрима:
git branch -u <remote-name>/<remote-branch-name> [local-branch-name],

если local-branch-name не задана, используется текущая ветка

-----------------------------------------------------------------------------------------------
Создать патч:
git diff COMMIT - патч без учёта автора и подписей
git format-patch START_COMMIT - патч с учётом автора и подписей
git format-patch START_COMMIT..END_COMMIT - то же, но для заданного диапазона

Применить патч:
git apply < FILE.patch - применит патч без учёта подписей и автора
git am < FILE.patch - применит патч с учётом подписей и автора

-----------------------------------------------------------------------------------------------
Если изменения были в обеих ветках, которые надо слить:
git rebase -i TARGET_COMMIT - на TARGET_COMMIT накладывается текущая ветка
git rebase -i TARGET_COMMIT SRC_COMMIT - на TARGET_COMMIT накладывается SRC_COMMIT

Если нужно применить выборочный коммит к текущей ветке:

git cherry-pick COMMIT [-n] - ключ -n показывает, что изменения будут применены без индексации и создания нового коммита

Найти коммит в истории изменений, даже если на него нет указателей (он впереди всех):
git reflog

Для редактирования конфликтов:
git mergetool

Удалить лишний файл из всей истории коммитов git:
git filter-branch --tree-filter 'rm <top/secret/file>' HEAD

В результате директория .git/refs/original будет описывать состояние дел до выполнения операции. Убедиться, что команда filter-branch сделала то, что нужно => и потом можно удалить эту директорию.
Эту директорию нужно удалить, чтобы использовать данную команду снова.

У меня два репозитория. В одном я вношу изменения в файл ./hello.test . Я фиксирую изменения и создаю патч из этого коммита с помощью git format-patch -1 HEAD . Теперь у меня есть второй репозиторий , который содержит файл , который имеет то же содержание , как hello.test но помещается в другом каталоге под другим именем: ./blue/red/hi.test . Как мне применить к hi.test файлу вышеупомянутый патч ? Я пробовал, git am --directory='blue/red' < patch_file но он, конечно, жалуется, что файлы имеют разные имена (я думал, что Git не заботится?). Я знаю, что, вероятно, мог бы отредактировать разницу для применения к этому конкретному файлу, но я ищу командное решение.

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

Возможно, вы можете что-то сделать с am или apply , но я не могу этого найти. Если вы обнаружите, что часто дублируете изменения, может быть лучшее решение с использованием подмодулей или того, что ваш язык по выбору предоставляет для совместного использования кода (например, в Ruby вы можете извлечь повторяющийся код как драгоценный камень). На самом деле это связано с документацией (исходные файлы - это XML). Подмодули на самом деле не вариант, поскольку мне нужно было бы убедительно аргументировать их в нашей существующей инфраструктуре.

Существует простое решение, которое не требует ручного редактирования патчей или внешнего скрипта.

В первом репозитории (это также может экспортировать диапазон фиксации, используйте, -1 если вы хотите выбрать только одну фиксацию):

Во втором репозитории:

Вместо использования --relative in git format-patch другим решением является использование -p<n> опции in git am для удаления n каталогов из пути патчей, как упоминалось в ответе на аналогичный вопрос .

Также можно запустить git format-patch --relative <committish> без --stdout , и он будет генерировать набор .patch файлов. Эти файлы затем могут быть загружены напрямую с git am помощью git am --directory blue/red/ path/to/*.patch .

Доброго времени, господа! Я тут уже не первый раз прошу помочь мне решить проблему, связанную с новыми ядрами и, возможно, нашел возможность, решить вопрос. Но, так как я являюсь абсолютно непродвинутым пользователем, а именно хлебушком среди линуксоидов, я очень прошу вас, более опытные друзья и соратники, объяснить мне как применить патч для решения моей проблемы.

Представьте, что я абсолютно не понимаю, о чем там говорится и не нашел нужной информации в интернете о том, как правильно применять этот патч. Всё что я сделал, это yum install git, так как мне нужно было через bisect компилировать тестовые ядра и т.д. Пожалуйста, объясните, каким образом этот патч применить в fedora. Заранее спасибосы!

На сколько я вижу, это исходники для 21-ой федоры, а у меня 20-ая. Это как-то может повлиять?

diff --git в терминале выдает "--git неизвестный ключ".

Если вас не затруднит, вы не могли бы пошагово объяснить процесс, а то я абсолютный 0 в этом.

Если на пальцах: у тебя есть патч, который нужно применить к drm драйверу radeon, исходные коды которого находятся в src.rpm что я тебе показал.

Нужно отредактировать spec файл и закинуть патч. Смотри статью, что я привел выше.


3. Собрать и установить ядро

По пунктам 1 и 3 см. документацию на федору.
А что за ядро такое древнее? Например, в 3.12.40 этот патч уже наложен. Может проще обновиться?

Lavos ★★★★★ ( 12.04.15 15:08:53 )
Последнее исправление: Lavos 12.04.15 15:10:35 (всего исправлений: 2)


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

3.12 ядро. В общем, попытался установкить, начал конфликтовать с каким-то файлом из папки radeon. Ребутнул систему. Итог: Слетел wi-fi, не видит флешки, слетели эффекты по alt+tab. Не могу найти инфу по восстановлению интернета, а reinstall NetwormManager'a без интернета не работает. Походу, снова буду ставить систему заново. Уже тошнит от этого радеона.

То есть, то что я вожусь с ноутом 10ти летней давности , является абсолютным показателем того, что я готов ради это вывалить немного денег)?


я вожусь с ноутом 10ти летней давности

Я тут уже не первый раз прошу помочь мне решить проблему


начал конфликтовать с каким-то файлом из папки radeon

Кто начал? patch? Точно из папки, может из мамки?
Если патч, то случаем не так: 'Reversed (or previously applied) patch detected!'?

  1. файлы перевода .po следует отправлять как целые файлы
  2. новые файлы должны быть отправлены как целые файлы с указанием места их размещения

Contents

Требования

Вам нужны версии Lazarus (или FPC) trunk/для разработки. Вы можете получить Lazarus(и FPC), используя SVN или Git.

  • SVN: Версия Lazarus для разработчиков. Это родной репозиторий.
  • Git: Git mirrors и Lazarus Git-svn. Лазарь зеркалируется в GitHub. Git также может использовать сервер SVN напрямую с помощью ссылки git-svn.

Предупреждение: Если вы отправляете исправления, не создавайте их на основе стабильных версиий Lazarus/FPC. Обычно версия для разработки сильно отличается от стабильной версии, так как разработчики применили множество улучшений и исправлений.

Отличия платформы

В инструкциях ниже предполагается, что вы открыли командную строку и переместились (команда cd) в каталог хранилища. Вот подробности:

Windows

Предполагая, что вы извлекли Lazarus в C:\lazarus, откройте командную строку (cmd.exe) и введите «cd \lazarus».

*nix systems

Предполагая, что вы извлекли Lazarus в

/lazarus, откройте терминал и наберите "cd

Создание патча с использованием SVN

Это включает в себя все измененные файлы во всем хранилище SVN.

Примечание: Если вы используете TortoiseSVN в Windows, вы можете выбрать папку, в которую Lazarus был извлечен в Windows Explorer, а затем щелкнуть правой кнопкой мыши, чтобы выбрать TortoiseSVN-> Create Patch(Создать патч) .

См.также Разрешение проблем, если у вас имеются проблемы .

Создание патча с помощью Git

Во-первых, разрабатывайте свой код в отдельной ветке!

Пока ваша ветка разработки активна, вы можете создавать патчи всех ваших локальных коммитов:

Это создает набор исправлений с именами, такими как "0001-CommitMsg.patch", "0002-CommitMsg.patch" и так далее.

Если вы хотите, чтобы все изменения были внесены в один патч, либо объедините коммиты, используя "git rebase -i . ", либо используйте следующую команду:

Примечание: ветка "master" при использовании ссылки git-svn следует за транком SVN по умолчанию. Однако зеркальный репозиторий в GitHub вместо этого использует ветку "upstream". Тогда вы должны заменить "master" на "upstream" в выше приведенных командах.

Отправка патча

Теперь у вас есть патч. Я бы посоветовал еще раз просмотреть файл, чтобы убедиться, что он выглядит нормально (без неожиданных изменений).

Рекомендуемый способ отправки патча - через bug tracker, подробности см. Как создать отчет об ошибке. Если есть отчет о проблеме, исправляемой вашим патчем, используйте ее, в противном случае создайте новую проблему. Загрузите файл, чтобы прикрепить его к проблеме.

Использование веток Git-репозитория напрямую

Можно использовать Git распределенным образом и для разработки Lazarus. По крайней мере, разработчики JuhaManninen и Alexander Klenin ("Ask") готовы принимать код в Git-репозитории.

На практике хранилище должно быть разветвлено из зеркала Lazarus в GitHub. Код должен быть в отдельной ветке и перебазирован от ветки "upstream". Это еще не проверено, мы можем добавить больше деталей, когда кто-то на самом деле ответвится от репо и создаст код.

Ограничением этой модели является то, что код должен принадлежать к области компетенции разработчиков, работающих с Git. Если код находится за пределами этой области, вы все равно можете использовать Git, но вы должны создавать патчи и отправлять их в bug tracker.

Применение патча

Это объясняет, как применить чей-то патч к вашему локальному репозиторию. Вы можете протестировать патч с помощью переключателя --dry-run следующим образом:

Вывод патченной программы будет идентичен действительному исправлению, только это не изменит файлы исходного кода. Очень удобно для тестирования, без вероятности испортить ваш исходник.

Патч, созданный с помощью "svn diff"

Для окончательного исправления используйте следующую командную строку:

Если это не сработает, потому что макет пути вашей среды выполнения отличается от среды выполнения, в которой было создано исправление, вы можете указать patch'у удалить всю информацию о путях:

Любой инструмент с графическим интерфейсом для diff'ов в Windows также может обрабатывать эти патчи, включая TortoiseMerge.

Патч, созданный с помощью "git format-patch"

Сам Git применяет патч так:

patch

Команда "patch" теперь поддерживает патчи в формате git с параметром -p1. Это проверено с патчем v.2.6.1 в Linux, старые версии могут не поддерживать его.

"patch" также доступен для Windows, но есть инструменты и для работы с графическим интерфейсом.

TortoiseMerge

TortoiseMerge поддерживает исправление формата Git без проблем. Он устанавливается вместе с Tortoise SVN, но не встроен в проводник. Он должен быть открыт из меню «Пуск».

ToDo: добавить больше инструментов с графическим интерфейсом, которые поддерживают патчи формата Git

Читайте также: