Что значит исправить файл
Обновлено: 21.11.2024
Получите полный доступ к Git Pocket Guide и более чем 60 000 других наименований с бесплатной 10-дневной пробной версией O'Reilly.
Есть также прямые онлайн-мероприятия, интерактивный контент, материалы для подготовки к сертификации и многое другое.
Глава 11. Общие сведения о патчах
«Заплатка» — это компактное представление различий между двумя файлами, предназначенное для использования с текстовыми файлами, ориентированными на строки. Он описывает, как превратить один файл в другой, и является асимметричным: патч от file1 до file2 не совпадает с патчем для другого направления удалите и добавьте противоположные строки, как мы увидим). Формат исправления использует контекст, а также номера строк для поиска различных областей файла, так что исправление часто может быть применено к несколько более ранней или более поздней версии первого файла, чем та, из которой оно было получено, при условии, что применяющая программа все еще может определить контекст изменения.
Термины "исправление" и "дифф" часто используются как синонимы, хотя между ними существует различие, по крайней мере, исторически сложившееся. Дифференциалу нужно только показать различия между двумя файлами, и при этом он может быть минимальным. Патч — это расширение diff, дополненное дополнительной информацией, такой как строки контекста и имена файлов, которые позволяют применять его более широко. В наши дни программа Unix diff может создавать различные исправления.
Вот простой патч, сгенерированный git diff :
Разбивая это на разделы:
Это заголовок различий Git; diff --git не является буквальной командой, а просто предлагает понятие специфического для Git diff в командном стиле Unix. a/foo.c и b/foo.c — это сравниваемые файлы с добавленными начальными именами каталогов a и b< /em>, чтобы различать их в случае, если они одинаковые (как здесь; этот патч показывает изменения от одной версии к другой одного и того же файла). Чтобы сгенерировать этот патч, я изменил файл foo.c и запустил git diff , который показывает неустановленные изменения между рабочим деревом и индексом. На самом деле в репозитории нет каталогов с именами a и b; это просто условность:
Это расширенная строка заголовка, одна из нескольких возможных форм, хотя в этом патче она только одна. Эта строка содержит информацию об этом файле из индекса Git: 30cfd169 и 8de130c2 — идентификаторы больших двоичных объектов сравниваемых версий содержимого файла A и B, а 100644 — «биты режима», указывающие на то, что это обычный файл: не исполняемый файл, а не символическая ссылка (использование .. здесь между идентификаторами больших двоичных объектов используется только как разделитель и не имеет ничего общего с его использованием в именовании наборов версий или для git diff ). В других строках заголовка могут указываться старый и новый режимы, если они изменились, старые и новые имена файлов, если файл переименовывается и т. д.
Идентификаторы больших двоичных объектов полезны, если это исправление позже будет применено Git к тому же проекту, и при его применении возникнут конфликты. Если эти большие двоичные объекты находятся в базе данных объектов, Git может использовать их для выполнения трехстороннего слияния с этими двумя версиями и рабочей копией, чтобы помочь вам разрешить конфликты. Патч по-прежнему имеет смысл для других инструментов, помимо Git; они просто проигнорируют эту строку и не смогут использовать дополнительную информацию:
Это традиционный «унифицированный» заголовок сравнения, снова показывающий сравниваемые файлы и направление изменений, которые будут показаны позже: знаки минуса будут отображать строки в версии A, но отсутствующие в версии B; и знаки плюс, строки, отсутствующие в A, но присутствующие в B. Если бы патч добавлял или удалял этот файл полностью, одним из них был бы /dev/null, чтобы сигнализировать о том, что:
Это раздел отличий, или «кусок», которого в этом различии только один. Строка, начинающаяся с @@, указывает номером строки и длиной позиции этого куска в версиях A и B; здесь ханк начинается со строки 1 и растягивается на 5 строк в обеих версиях. Последующие строки, начинающиеся с пробела, являются контекстными: они отображаются так, как показано в обеих версиях файла. Строки, начинающиеся со знаков минус и плюс, имеют только что упомянутое значение: этот патч заменяет одну строку, исправляя распространенную ошибку C, из-за которой программа падала, если этой функции был передан нулевой указатель в качестве строкового аргумента.
Один файл исправления может содержать различия для любого количества файлов, и git diff создает различия для всех измененных файлов в репозитории в одном исправлении (в отличие от обычной команды Unix diff, которая требует дополнительных параметров для рекурсивной обработки всего каталога). деревья).
Применение простых различий
Если вы сохраняете вывод git diff в файл (например, с помощью git diff > foo.patch ), вы можете применить его к той же или аналогичной версии файла в другом месте с помощью git apply или других распространенных инструментов. которые обрабатывают формат diff, например patch (хотя они не смогут использовать какую-либо дополнительную информацию, специфичную для Git, в diff).Это полезно для сохранения набора незафиксированных изменений для применения к другому набору файлов или для передачи любого набора изменений кому-то еще, кто не использует Git.
Вы можете использовать выходные данные git show commit в качестве исправления, представляющего изменения для данной фиксации без слияния, в качестве ярлыка для git diff commit ~ commit (явное сравнение коммита и его родителя).
Исправления с информацией о фиксации
Существует другой формат патчей, специфичный для Git, который содержит не только патчи для некоторого количества файлов, но и метаданные коммита: автора, метку времени и сообщение. Он содержит всю информацию, необходимую для повторного применения изменений из одной фиксации в качестве новой фиксации в другом месте, и полезен для передачи фиксации, когда это невозможно или неудобно сделать с помощью обычного механизма Git push/pull.
Вы создаете этот формат исправления с помощью git format-patch и применяете его с помощью git am. Сам патч на самом деле имеет почтенный формат почтового ящика Unix, используя заголовки электронной почты «от», «дата» и «тема» в качестве автора, метки времени и темы сообщения фиксации, а также тело электронной почты в качестве остальной части сообщения. Патч коммита для предыдущего примера может выглядеть так:
Начальная строка содержит исходный идентификатор коммита и фиксированную отметку времени, означающую, что это «электронное письмо» было создано с помощью git format-patch . Префикс [PATCH] в теме не является частью сообщения фиксации, а предназначен для того, чтобы отличать исправления от других сообщений электронной почты. Далее следует сводка diffstat по патчу (которую можно подавить с помощью --no-stat (-p) ), а затем сам патч в показанном ранее формате.
Вы запускаете git format-patch следующим образом:
Аргумент revisions может быть любым выражением, указывающим набор коммитов для форматирования, как описано в главе 8. Однако в качестве исключения один коммит C означает C..HEAD , т. е. коммиты в текущей ветке, не содержащиеся в C (если C находится в этой ветке, это коммиты, сделанные после C ). Чтобы получить другое значение, то есть все коммиты, доступные из C, используйте параметр --root.
По умолчанию Git записывает исправления для выбранных коммитов в последовательно пронумерованные файлы в текущем каталоге с именами, отражающими строки темы сообщения коммита, например:
Начальные числа в именах файлов упрощают применение этих исправлений по порядку с помощью git am *.patch , поскольку оболочка будет сортировать их лексикографически при раскрытии подстановочного знака. Вы можете указать другой каталог вывода с помощью --output-directory (-o) или записать все исправления в стандартный вывод с помощью --stdout ; git am читает со стандартного ввода, если не заданы аргументы файла (или один дефис в качестве единственного аргумента, git am - ).
git format-patch использует ряд других параметров для управления результирующим форматом электронной почты, таких как добавление других почтовых заголовков, а также многие параметры, используемые git diff для воздействия на сам diff; см. git-format-patch(1) и git-diff(1) для более подробной информации. Также см. Импорт линейной истории для некоторых примеров.
Получите карманное руководство по Git прямо сейчас с онлайн-обучением O’Reilly.
Члены O’Reilly проходят онлайн-обучение в режиме реального времени, а также получают книги, видео и цифровой контент от более чем 200 издателей.
У вас возникли проблемы с открытием файла PATCH или вам просто интересно, что он содержит? Мы объясним, для чего используются эти файлы, и покажем вам программное обеспечение, которое, как мы знаем, может открывать или иным образом обрабатывать ваши файлы.
Что такое файл PATCH?
Файлы PATCH имеют множество применений, и diff Patch — одно из них.
diff файл исправления
Файлы с расширением .patch используются различными программными приложениями для установки исправлений и обновлений программного обеспечения.
Разработчик создает и распространяет файл исправления, содержащий данные, необходимые для обновления приложения или устранения проблемы с соответствующей программой.
Файлы исправлений могут использоваться для исправления ошибок программного обеспечения, улучшения удобства использования программы, замены графики или обновления функций программного обеспечения. Эти файлы гарантируют, что пользователь работает с самой последней версией программного приложения и что ошибки и ошибки в программном обеспечении, с которым он работает, устранены.
Как открыть файлы PATCH
Важно: разные программы могут использовать файлы с расширением PATCH для разных целей, поэтому, если вы не уверены, какой формат у вашего файла PATCH, вам может потребоваться попробовать несколько разных программ.
Хотя мы сами еще не проверяли приложения, наши пользователи предложили 6 различных открывателей PATCH, которые вы найдете в списке ниже.
Последнее обновление: 16 марта 2022 г.
Другие форматы файлов, использующие расширение PATCH
Исследуя файлы PATCH, мы знаем, что существуют следующие форматы. Однако мы еще не проанализировали их подробно, и мы хотели бы услышать от вас, если у вас есть информация о любом из них.
Файл исправления imgdiff для Android
Суперджем!Файл исправления
Различные приложения, использующие файлы с этим расширением
Известно, что эти приложения открывают определенные типы файлов PATCH. Помните, что разные программы могут использовать файлы PATCH для разных целей, поэтому вам может потребоваться попробовать некоторые из них, чтобы открыть конкретный файл.
Edge Code CC | Отправлено пользователем | |
< /td> | Квадратные скобки | Отправлено пользователем |
Bluefish | Отправлено пользователем | |
SlickEdit | Отправлено пользователем | |
Мир of Tanks | Отправлено пользователем |
Мод Aslain XVM< /td> | Отправлено пользователем |
Не уверены, какой тип файла вы пытаетесь открыть? Попробуйте наш новый анализатор файлов. Это бесплатный инструмент, который может идентифицировать более 11 000 различных типов файлов — скорее всего, и ваши! Это поможет вам найти программное обеспечение, которое может обрабатывать файлы определенного типа. Загрузите анализатор файлов здесь.
Дэйв Маккей
Дэйв Маккей
Писатель
Команда patch для Linux позволяет быстро и безопасно перенести изменения из одного набора файлов в другой набор файлов. Узнайте, как использовать патч простым способом.
Команды patch и diff
Представьте, что у вас есть текстовый файл на вашем компьютере. Вы получаете измененную версию этого текстового файла от кого-то другого. Как быстро перенести все изменения из измененного файла в исходный файл? Вот тут и вступают в игру patch и diff. patch и diff можно найти в Linux и других Unix-подобных операционных системах, таких как macOS.
Команда diff проверяет две разные версии файла и перечисляет различия между ними. Различия могут быть сохранены в файле, называемом файлом исправления.
Команда patch может прочитать файл исправления и использовать его содержимое в качестве набора инструкций. Следуя этим инструкциям, изменения в измененном файле реплицируются в исходном файле.
Теперь представьте, что этот процесс происходит с целым каталогом текстовых файлов. Все за один раз. В этом сила исправления .
Иногда вам не отправляются измененные файлы. Все, что вам пришлют, это файл патча. Зачем рассылать десятки файлов, если можно отправить один файл или опубликовать один файл для легкой загрузки?
Что вы делаете с файлом исправления, чтобы действительно исправить ваши файлы? Помимо того, что это почти скороговорка, это еще и хороший вопрос. Мы расскажем вам об этом в этой статье.
Команда patch чаще всего используется людьми, работающими с файлами исходного кода программного обеспечения, но она одинаково хорошо работает с любым набором текстовых файлов, независимо от их назначения, независимо от того, исходный код или нет.
Наш пример сценария
В этом сценарии мы находимся в каталоге work, который содержит два других каталога. Один называется рабочий, а другой называется последний. Рабочий каталог содержит набор файлов исходного кода. Последний каталог содержит самые последние версии этих файлов исходного кода, некоторые из которых были изменены.
В целях безопасности рабочий каталог является копией текущей версии текстовых файлов. Это не единственная их копия.
Поиск различий между двумя версиями файла
Команда diff находит различия между двумя файлами. Его действием по умолчанию является отображение списка измененных строк в окне терминала.
Один файл называется slang.c . Мы сравним версию в рабочем каталоге с версией в последнем каталоге.
Опция -u (унифицированная) указывает diff также перечислить некоторые неизмененные текстовые строки до и после каждого из измененных разделов. Эти строки называются строками контекста. Они помогают команде patch точно определить, где в исходном файле необходимо внести изменение.
Мы предоставляем имена файлов, чтобы программа diff знала, какие файлы сравнивать. Исходный файл указан первым, затем измененный файл. Это команда, которую мы вводим для сравнения:
diff формирует выходной список, показывающий различия между файлами. Если бы файлы были идентичными, вывод вообще не отображался бы. Этот тип выходных данных из diff подтверждает наличие различий между двумя версиями файлов и необходимость исправления исходного файла.
Создание файла исправления
Чтобы зафиксировать эти различия в файле исправления, используйте следующую команду.Это та же самая команда, что и выше, но вывод из diff перенаправляется в файл с именем slang.patch.
Имя файла исправления может быть произвольным. Вы можете называть это как угодно. Дать ему расширение «.patch» — хорошая идея; тем не менее, поскольку это дает понять, какой это тип файла.
Чтобы патч воздействовал на файл патча и модифицировал файл work/slang.c, используйте следующую команду. Параметр -u (унифицированный) сообщает patch, что файл исправления содержит унифицированные контекстные строки. Другими словами, мы использовали параметр -u с diff, поэтому мы используем параметр -u с patch .
patch -u work.slang.c -i slang.patch
Если все пойдет хорошо, появится единственная строка вывода, говорящая о том, что patch исправляет файл.
Создание резервной копии исходного файла
Мы можем указать patch сделать резервную копию исправленных файлов перед их изменением, используя параметр -b (резервная копия). Параметр -i (ввод) указывает patch имя используемого файла исправления:
Файл исправлен, как и раньше, без видимой разницы в выводе. Однако, если вы заглянете в рабочую папку, вы увидите, что файл с именем slang.c.orig был создан. Отметки даты и времени файлов показывают, что slang.c.orig — это исходный файл, а slang.c — это новый файл, созданный патчем .
Использование сравнения с каталогами
Мы можем использовать diff для создания файла исправления, содержащего все различия между файлами в двух каталогах. Затем мы можем использовать этот файл исправления с patch, чтобы применить эти различия к файлам в рабочей папке с помощью одной команды.
Параметры, которые мы собираемся использовать с diff, — это параметр -u (унифицированный контекст), который мы использовали ранее, параметр -r (рекурсивный), чтобы заставить diff просматривать любые подкаталоги, и параметр -N (новый файл). ) вариант.
Опция -N сообщает diff, как обрабатывать файлы в последнем каталоге, которые не находятся в рабочем каталоге. Это заставляет diff поместить инструкции в файл исправления, чтобы исправление создавало файлы, которые присутствуют в последнем каталоге, но отсутствуют в рабочем каталоге.
Вы можете сгруппировать параметры вместе, чтобы они использовали один дефис (-).
Обратите внимание, что мы предоставляем только имена каталогов, мы не говорим diff просматривать определенные файлы:
Заглянуть внутрь файла исправления
Давайте быстро взглянем на файл исправления. Мы будем использовать меньше, чтобы просмотреть его содержимое.
В верхней части файла показаны различия между двумя версиями slang.c.
Прокручивая дальше файл исправления, мы видим, что затем он описывает изменения в другом файле с именем structs.h. Это подтверждает, что файл исправления определенно содержит различия между разными версиями нескольких файлов.
Посмотри, прежде чем прыгнуть
Исправление большой коллекции файлов может немного нервировать, поэтому мы воспользуемся параметром --dry-run, чтобы убедиться, что все в порядке, прежде чем сделать решительный шаг и взять на себя обязательство внести изменения.
Опция --dry-run указывает патчу делать все, кроме фактического изменения файлов. patch выполнит все свои проверки перед запуском файлов и, если обнаружит какие-либо проблемы, сообщит о них. В любом случае никакие файлы не изменяются.
Если проблем не обнаружено, мы можем повторить команду без параметра --dry-run и уверенно пропатчить наши файлы.
Опция -d (каталог) указывает патчу, с каким каталогом работать.
Обратите внимание, что мы не используем параметр -i (ввод), чтобы сообщить патчу, какой файл патча содержит инструкции из diff . Вместо этого мы перенаправляем файл исправления в patch с помощью .
Из всего каталога diff нашел два файла для исправления.Инструкции относительно изменений для этих двух файлов были проверены патчем , и никаких проблем не было зарегистрировано.
Предполетные проверки прошли нормально; мы готовы к взлету.
Исправление каталога
Чтобы действительно применить исправления к файлам, мы используем предыдущую команду без параметра --dry-run.
На этот раз каждая строка вывода начинается не со слова «проверка», а со слова «исправление».
И никаких проблем не сообщается. Мы можем скомпилировать наш исходный код, и у нас будет последняя версия программного обеспечения.
Уладить разногласия
Это самый простой и безопасный способ использования patch . Скопируйте целевые файлы в папку и исправьте эту папку. Скопируйте их обратно, когда будете уверены, что процесс исправления завершился без ошибок.
Команды Linux | |
Файлы | tar · pv · cat · tac · chmod · grep · diff · sed · ar · man · pushd · popd · fsck · testdisk · seq · fd · pandoc · cd · $PATH · awk · join · jq · fold · uniq · journalctl · tail · stat · ls · fstab · echo · less · chgrp · chown · rev · look · strings · type · rename · zip · unzip · mount · umount · install · fdisk · mkfs · rm · rmdir · rsync · df · gpg · vi · nano · mkdir · du · ln · patch · convert · rclone · shred · srm |
Процессы | alias · screen · top · nice · renice · прогресс · strace · systemd · tmux · chsh · история · at · пакетное · бесплатное · которое · dmesg · chfn · usermod · ps · chroot · xargs · tty · pinky · lsof · vmstat · timeout · стена · yes · kill · спать · sudo · su · время · groupadd · usermod · группы · lshw · выключение · перезагрузка · halt · poweroff · passwd · lscpu · crontab · date · bg · fg |
Сеть | netstat · ping · traceroute · ip · ss · whois · fail2ban · bmon · копать · finger · nmap · ftp · curl · wget · who · whoami · w · iptables · ssh-keygen · ufw |
- › Почему СМС должен умереть
- › Что такое GrapheneOS и как она делает Android более приватным?
- › Что означает XD и как вы его используете?
- › 7 основных функций Microsoft Excel для составления бюджета
- › Почему прозрачные чехлы для телефонов желтеют?
- › Худшее, что есть в телефонах Samsung, — это программное обеспечение Samsung.
7.2. Что такое патч?
Исправление (также иногда называемое diff) – это текстовый файл, который показывает изменения в файле (или нескольких файлах) по сравнению с предыдущей версией. Как правило, патч показывает построчные изменения, отмеченные знаком «+» (знак «плюс») или «-» (знак «минус») для обозначения добавлений и удалений в коде соответственно. Некоторые форматы исправлений также включают окружающие строки кода для предоставления контекста и номеров строк, связанных с изменениями.
Исправление является предпочтительным способом внесения изменений в проект FOSS. Это связано с тем, что патчи являются стандартным форматом и могут быть легко прочитаны и поняты разработчиками, знакомыми с кодовой базой. Патч может включать описания нескольких изменений в нескольких файлах, и это делает патчи отличным форматом для представления исправлений ошибок или улучшений кода, которые могут касаться многих файлов в более крупном проекте.
7.2.1. Пример простого исправления
В этом примере вы создаете небольшое изменение в файле исходного кода, чтобы увидеть, как создать исправление. Файл, с которого вы начинаете, представляет собой простую программу Hello, World hello.c, написанную на C.
Этот вывод не слишком захватывающий — вместо этого замените знаки препинания восклицательным знаком, чтобы действительно получить немного энтузиазма! Первым шагом при внесении изменений является создание копии файла, над которым вы работаете. Если вы работаете с кодом, находящимся в системе контроля версий, в этом шаге нет необходимости. А пока предположим, что этот код не извлечен из репозитория (позже в этой главе вы попрактикуетесь в создании исправлений с помощью Subversion).
Затем создайте резервную копию файла hello.c и назовите его hello.c.punct, чтобы вы знали, что этот файл связан с изменением пунктуации.
Далее отредактируйте hello.c и оставьте резервную копию hello.c.punct как есть. Используя ваш любимый редактор, откройте hello.c и измените файл ' . ' в операторе printf быть ' ! '. Сохраните файл и выйдите из редактора. Теперь создайте патч, показывающий внесенные изменения. Для этого используйте команду diff.Поскольку многие считают, что унифицированный формат сравнения более удобен для чтения, сгенерируйте исправление в этом формате, передав флаг -u команде diff. Выполните следующую команду, чтобы распечатать патч на экране:
Первые две строки представляют сравниваемые файлы, показывая имя файла, а также дату последнего изменения.
Далее идут один или несколько ханков (фрагментов файла), показывающих различия между файлами. В этом случае у вас есть только одно изменение, поэтому отображается только один фрагмент. Каждый фрагмент начинается с текста @@ и чисел, которые представляют собой номера строк, отображаемых в изменении для старого (отмеченного знаком '-') и нового (отмеченного знаком '+') файлов соответственно.
Затем он выводит различия между файлами. Поскольку вы использовали флаг -u для установки унифицированного формата вывода, есть несколько показанных строк, которые не изменились; они выводятся с пробелом перед ними.
Обратите внимание, что однострочное изменение на самом деле отображается как удаление всей строки, а затем добавление новой измененной строки.
Читайте также: